Salam! Java Syntax Pro gözleginde lambda aňlatmalaryny öwrendik we olaryň funksional interfeýsden funksional usuly ýerine ýetirmekden başga zat däldigini aýtdyk. Başga sözler bilen aýdylanda, bu käbir näbelli (näbelli) synpyň durmuşa geçirilmegi, durmuşa geçirilmedik usuly. Eger-de kursyň leksiýalarynda lambda aňlatmalary bilen manipulýasiýa öwrenen bolsak, indi başga bir tarapy göz öňünde tutarys: ýagny bu interfeýsler. Java-yň sekizinji wersiýasy funksional interfeýs düşünjesini girizdi . Bu näme? Bir ýerine ýetirilmedik (abstrakt) usuly bolan interfeýs işleýär. Köp sanly interfeýsler, meselem, öň ara alnyp maslahatlaşylan interfeýs ýaly bu kesgitlemäniň çägine girýär . Şeýle hem özümizi döredýän interfeýsler: Predikat
Sarp ediji
Üpjün ediji
Funksiýa
UnaryOperator
Comparator
@FunctionalInterface
public interface Converter<T, N> {
N convert(T t);
}
Bizde interfeýs bar, onuň wezipesi bir görnüşdäki obýektleri başga bir obýektlere (adapteriň bir görnüşine) öwürmek. Annotasiýa @FunctionalInterface
gaty çylşyrymly ýa-da möhüm zat däl, sebäbi maksady düzüjä bu interfeýsiň işleýändigini we birden köp usulyň bolmaly däldigini aýtmakdyr. Bu düşündirişli interfeýsde birden köp ýerine ýetirilmedik (abstrakt) usul bar bolsa, düzüji bu interfeýsi taşlamaz, sebäbi ýalňyş kod hökmünde kabul eder. Bu düşündirişsiz interfeýsler funksional hasap edilip bilner we işlär, ýöne @FunctionalInterface
bu goşmaça ätiýaçlandyryşdan başga zat däl. Geliň, klasa gaýdaly Comparator
. Onuň koduna (ýa-da resminamalaryna ) seretseňiz , onuň birden köp usulynyň bardygyny görüp bilersiňiz. Soňra soraýarsyňyz: onda nädip funksional interfeýs hasaplap bolar? Abstrakt interfeýslerde ýekeje usulyň çäginde bolmadyk usullar bolup biler:
- statik
@FunctionalInterface
public interface Converter<T, N> {
N convert(T t);
static <T> boolean isNotNull(T t){
return t != null;
}
}
Bu usuly alansoň, düzüji arz etmedi, bu biziň interfeýsimiziň henizem işleýändigini aňladýar.
- esasy usullar
default
:
@FunctionalInterface
public interface Converter<T, N> {
N convert(T t);
static <T> boolean isNotNull(T t){
return t != null;
}
default void writeToConsole(T t) {
System.out.println("Текущий an object - " + t.toString());
}
}
Againene-de düzüjiniň arz edip başlamandygyny we funksional interfeýsiň çäklerinden çykmaýandygymyzy görýäris.
- Obýekt synp usullary
Object
. Bu interfeýslere degişli däl. Theöne interfeýsde goluň synpyň käbir usuly bilen gabat gelýän abstrakt usuly bar bolsa Object
, şeýle usul (ýa-da usullar) funksional interfeýs çäklendirmäni bozmaz:
@FunctionalInterface
public interface Converter<T, N> {
N convert(T t);
static <T> boolean isNotNull(T t){
return t != null;
}
default void writeToConsole(T t) {
System.out.println("Текущий an object - " + t.toString());
}
boolean equals(Object obj);
}
Againene-de düzüjimiz arz etmeýär, şonuň üçin interfeýs Converter
henizem işleýär. Indi sorag: näme üçin özümizi funksional interfeýsde ýerine ýetirilmedik bir usul bilen çäklendirmeli? Soň bolsa lambdalary ulanyp durmuşa geçirip bileris. Geliň, muňa mysal bilen seredeliň Converter
. Munuň üçin synp döredeliň Dog
:
public class Dog {
String name;
int age;
int weight;
public Dog(final String name, final int age, final int weight) {
this.name = name;
this.age = age;
this.weight = weight;
}
}
Şuňa meňzeş Raccoon
(ýangyç):
public class Raccoon {
String name;
int age;
int weight;
public Raccoon(final String name, final int age, final int weight) {
this.name = name;
this.age = age;
this.weight = weight;
}
}
Bir obýektimiz bar diýsek Dog
, meýdanlaryna esaslanyp bir obýekt döretmeli Raccoon
. .Agny, Converter
bir görnüşdäki obýekti beýlekisine öwürýär. Bu nähili bolar:
public static void main(String[] args) {
Dog dog = new Dog("Bobbie", 5, 3);
Converter<Dog, Raccoon> converter = x -> new Raccoon(x.name, x.age, x.weight);
Raccoon raccoon = converter.convert(dog);
System.out.println("Raccoon has parameters: name - " + raccoon.name + ", age - " + raccoon.age + ", weight - " + raccoon.weight);
}
Işledenimizde, konsola aşakdaky çykyşy alarys:
Raccoon has parameters: name - Bobbbie, age - 5, weight - 3
Bu bolsa usulymyzyň dogry işleýändigini aňladýar.
Esasy Java 8 Funksiýa interfeýsleri
Indi, geliň, Java 8-iň bize getiren we Stream API bilen bilelikde işjeň ulanylýan birnäçe funksional interfeýslerine seredeliň.Predikat
Predicate
- belli bir şertiň ýerine ýetirilendigini barlamak üçin işleýän interfeýs. Şert ýerine ýetirilen bolsa, gaýdyp geler true
, ýogsam - false
:
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
Mysal hökmünde, Predicate
birnäçe görnüşiň deňligini barlaýan bir döretmegi göz öňünde tutuň Integer
:
public static void main(String[] args) {
Predicate<Integer> isEvenNumber = x -> x % 2==0;
System.out.println(isEvenNumber.test(4));
System.out.println(isEvenNumber.test(3));
}
Konsol çykyşy:
true
false
Sarp ediji
Consumer
(Iňlis dilinden - “sarp ediji”) - T görnüşli obýekti giriş argumenti hökmünde alýan, käbir hereketleri ýerine ýetirýän, ýöne hiç zat gaýtarmaýan funksional interfeýs:
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
Mysal hökmünde, geçen setir argumenti bilen konsola salam bermek kimiň wezipesine serediň: Consumer
public static void main(String[] args) {
Consumer<String> greetings = x -> System.out.println("Hello " + x + " !!!");
greetings.accept("Elena");
}
Konsol çykyşy:
Hello Elena !!!
Üpjün ediji
Supplier
(Iňlis dilinden - üpjün edijiden) - hiç hili argument almaýan, ýöne T görnüşindäki obýekti yzyna gaýtarýan funksional interfeýs:
@FunctionalInterface
public interface Supplier<T> {
T get();
}
Mysal hökmünde Supplier
sanawdan tötänleýin atlary çykarjakdygyna göz aýlaň:
public static void main(String[] args) {
ArrayList<String> nameList = new ArrayList<>();
nameList .add("Elena");
nameList .add("John");
nameList .add("Alex");
nameList .add("Jim");
nameList .add("Sara");
Supplier<String> randomName = () -> {
int value = (int)(Math.random() * nameList.size());
return nameList.get(value);
};
System.out.println(randomName.get());
}
Muny işledip görsek, konsoldaky atlaryň sanawyndan tötänleýin netijeleri göreris.
Funksiýa
Function
- bu funksional interfeýs T argumentini alýar we R görnüşindäki obýekte iberýär, netijede yzyna gaýtarylýar:
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
Mysal hökmünde, sanlary setir formatyndan ( ) san formatyna ( ) öwürýän alalyň : Function
String
Integer
public static void main(String[] args) {
Function<String, Integer> valueConverter = x -> Integer.valueOf(x);
System.out.println(valueConverter.apply("678"));
}
Işledenimizde, konsola aşakdaky çykyşy alarys:
678
PS: diňe sanlary däl, eýsem beýleki nyşanlary hem setire geçirsek, kadadan çykma - NumberFormatException
.
UnaryOperator
UnaryOperator
- T görnüşindäki obýekti parametr hökmünde alýan, üstünde birnäçe amallary ýerine ýetirýän we amallaryň netijesini T görnüşindäki obýekt görnüşinde yzyna gaýtarýan funksional interfeýs:
@FunctionalInterface
public interface UnaryOperator<T> {
T apply(T t);
}
UnaryOperator
usulyny apply
san inedördül görnüşinde ulanýar:
public static void main(String[] args) {
UnaryOperator<Integer> squareValue = x -> x * x;
System.out.println(squareValue.apply(9));
}
Konsol çykyşy:
81
Bäş sany funksional interfeýsine göz aýladyk. Java 8-den başlap, elýeterli zatlaryň hemmesi däl - bu esasy interfeýsler. Bar bolanlar, olaryň çylşyrymly analoglary. Doly sanawy resmi Oracle resminamalarynda tapyp bilersiňiz .
Akymdaky funksional interfeýsler
Aboveokarda aýdylyşy ýaly, bu funksional interfeýsler “Stream API” bilen berk baglanyşdyrylýar. Nädip soraýarsyňyz? Köp usullarStream
bu funksional interfeýsler bilen ýörite işleýär. Funksiýa interfeýsleriniň nähili ulanylyp bilinjekdigine seredeliň Stream
.
Predicate bilen usul
Mysal üçin, synp usulyny alalyňStream
- filter
bu argument hökmünde kabul edilýär Predicate
we Stream
diňe şerti kanagatlandyrýan elementleri gaýtaryp berýär Predicate
. -A kontekstinde , bu diňe interfeýs usulynda ulanylanda Stream
yzyna gaýtarylýan elementlerden geçýändigini aňladýar . Ine, mysalymyzyň gözleýän görnüşi , ýöne elementleriň süzgüçi üçin : true
test
Predicate
Predicate
Stream
public static void main(String[] args) {
List<Integer> evenNumbers = Stream.of(1, 2, 3, 4, 5, 6, 7, 8)
.filter(x -> x % 2==0)
.collect(Collectors.toList());
}
Netijede, sanaw evenNumbers
{2, 4, 6, 8 elements elementlerinden ybarat bolar. Rememberadymyzda bolsa, collect
ähli elementleri belli bir kolleksiýa ýygnaýar: biziň ýagdaýymyzda List
.
Sarp ediji bilen usul
Stream
Funksiýa interfeýsini ulanýan usullaryň biri Consumer
. Ine peek
, mysalymyz şeýle bolar : Consumer
Stream
public static void main(String[] args) {
List<String> peopleGreetings = Stream.of("Elena", "John", "Alex", "Jim", "Sara")
.peek(x -> System.out.println("Hello " + x + " !!!"))
.collect(Collectors.toList());
}
Konsol çykyşy:
Hello Elena !!!
Hello John !!!
Hello Alex !!!
Hello Jim !!!
Hello Sara !!!
Methodöne bu usul peek
bilen işleýänligi sebäpli Consumer
, setirleriň üýtgemegi Stream
bolup geçmez, asyl elementleri bilen peek
gaýdyp geler Stream
: edil şonuň ýaly. Şonuň üçin sanaw peopleGreetings
"enaelena", "Jon", "Alex", "Jim", "Sara" elementlerinden ybarat bolar. foreach
Usula meňzeş, köplenç ulanylýan usul hem bar peek
, ýöne tapawudy onuň ahyrky - terminal.
Üpjün ediji bilen usul
Stream
Funksiýa interfeýsini ulanýan usulyň mysaly Supplier
, generate
oňa berlen funksional interfeýsiň esasynda çäksiz yzygiderliligi döredýär. Supplier
Konsolda bäş sany tötänleýin at çap etmek üçin mysalymyzy ulanalyň :
public static void main(String[] args) {
ArrayList<String> nameList = new ArrayList<>();
nameList.add("Elena");
nameList.add("John");
nameList.add("Alex");
nameList.add("Jim");
nameList.add("Sara");
Stream.generate(() -> {
int value = (int) (Math.random() * nameList.size());
return nameList.get(value);
}).limit(5).forEach(System.out::println);
}
Konsolda alýan netijämiz:
John
Elena
Elena
Elena
Jim
limit(5)
Bu ýerde usuly çäklendirmek üçin usuly ulandyk generate
, ýogsam programma tötänleýin atlary konsola belli bir wagtlap çap ederdi.
Funksiýa usuly
Stream
Argumentli usulyň adaty mysaly, bir görnüşiň elementlerini alýan, olar bilen bir zat edip, geçirýän Function
usuldyr , ýöne bular eýýäm başga görnüşiň elementleri bolup biler. map
Muňa mysal Function
bolup biler Stream
:
public static void main(String[] args) {
List<Integer> values = Stream.of("32", "43", "74", "54", "3")
.map(x -> Integer.valueOf(x)).collect(Collectors.toList());
}
Netijede, sanlaryň sanawyny alýarys, ýöne Integer
.
UnaryOperator bilen usul
Argument hökmünde ulanýan usul hökmündeUnaryOperator
, synp usulyny alalyň Stream
- iterate
. Bu usul usula meňzeýär generate
: ol çäksiz yzygiderliligi döredýär, ýöne iki delili bar:
- birinjisi yzygiderliligiň başlanýan elementidir;
- ikinjisi
UnaryOperator
, birinji elementden täze elementleri döretmek ýörelgesini görkezýär.
UnaryOperator
, ýöne usulda iterate
:
public static void main(String[] args) {
Stream.iterate(9, x -> x * x)
.limit(4)
.forEach(System.out::println);
}
Işledenimizde, konsola aşakdaky çykyşy alarys:
9
81
6561
43046721
.Agny, elementlerimiziň hersiniň özi köpelýär we ilkinji dört san üçin we ş.m. Bu hemmesi! Bu makalany okanyňyzdan soň Java-da Stream API-e düşünmek we özleşdirmek üçin bir ädim ýakynlaşsaňyz gowy bolardy!
GO TO FULL VERSION