Stream API чист?
Stream API як роҳи нави кор бо сохторҳои додаҳо дар услуби функсионалӣ мебошад. Stream API (тафсири роҳҳое, ки як барномаи компютерӣ метавонад бо барномаи дигар муошират кунад) дар асл як ҷараёни додаҳо мебошад. Худи истилоҳи "ришта" дар барномасозӣ дар маҷмӯъ ва махсусан дар Java хеле норавшан аст.List<String> list = new ArrayList<String>();
list.add("One");
list.add("Two");
list.add("Three");
list.add("Four");
list.add("Five");
list.add("Six");
list.add("Seven");
list.add("Eight");
list.add("Nine");
list.add("Ten");
Stream stream = list.stream();
Тавре ки дар боло зикр гардид, Stream API ба шумо имкон медиҳад, ки шумораи сатрҳои codeро кам кунед. Мисол бо ҷараён:
IntStream.of(50, 60, 70, 80, 90, 100, 110, 120).filter(x -> x < 90).map(x -> x + 10)
.limit(3).forEach(System.out::print);
Мисол бе ришта:
int[] arr = {50, 60, 70, 80, 90, 100, 110, 120
int count = 0;
for (int x : arr) {
if (x >= 90) continue;
x += 10;
count++;
if (count > 3) break;
System.out.print(x);
}
Роҳҳои имконпазири эҷоди ҷараён:
- Ҷараёни холӣ:
Stream.empty()
- Ҷараён аз рӯйхат:
list.stream()
- Ҷараён аз харита:
map.entrySet().stream()
- Ҷараён аз массив:
Arrays.stream(array)
- Ҷараён аз унсурҳои муайяншуда:
Stream.of("1", "2", "3")
- Мобайнӣ (инчунин "танбал" номида мешавад) - коркарди унсурҳои воридотӣ ва баргардонидани ҷараён. Дар занҷири коркарди элементҳо метавонад бисёр операторҳои фосилавӣ бошанд.
- Терминал ("терминал", инчунин "талаб" номида мешавад) - унсурҳоро коркард мекунад ва ҷараёнро қатъ мекунад, бинобар ин дар занҷир танҳо як оператори терминал мавҷуд буда метавонад.
1.List<String> list = new ArrayList<String>();
2.list.add("One");
…
11.list.add("Ten");
12.Stream stream = list.stream();
13.stream.filter(x-> x.toString().length() == 3).forEach(System.out::println);
Дар ин ҷо чӣ мешавад:
- 1 - эҷод кардани рӯйхат
list
; - 2-11 — бо маълумотхои тестй пур кардан;
- 12 - сохтани an object
Stream
; - 13 - усул
filter
(филтр) - оператори фосилавӣ, киx
ба як унсури коллексия барои номбаркунӣ баробар карда мешавад (ба монанди боfor each
) ва баъд аз -> мо нишон медиҳем, ки коллексияи мо чӣ гуна филтр карда мешавад ва азбаски ин оператори мобайнӣ аст, коллексияи филтршуда ба қуттии усул,forEach
ки дар навбати худ аналоги терминалии (ниҳоии) рӯйхат мебошадfor each
(ИфодаиSystem.out::println
кӯтоҳ барои:,x-> System.out.println(x))
ки дар навбати худ аз тамоми унсурҳои коллексияи ба он гузашташуда мегузарад ва онро намоиш медиҳад)
- То он даме, ки оператори терминал даъват карда нашавад, коркард оғоз намешавад.
list.stream().filter(s -> s > 5)
(аз рӯйхат ягон элементро намегирад); - Намунаи ҷараён наметавонад бештар аз як маротиба истифода шавад =( ;
Аз ин рӯ, ҳар дафъае, ки он нав аст:
list.stream().filter(x-> x.toString().length() == 3).forEach(System.out::println);
list.stream().forEach(x -> System.out.println(x));
Дар як ҷараён метавонад бисёр операторҳои фосилавӣ даъват карда шаванд, дар ҳоле ки танҳо як оператори терминал вуҷуд дорад:
stream.filter(x-> x.toString().length() == 3).map(x -> x + " - the length of the letters is three").forEach(x -> System.out.println(x));
filter(Predicate predicate)
ҷараёнро филтр мекунад, танҳо он унсурҳоеро, ки шартро мегузаранд (Predicate интерфейси функсионалии дарунсохт аст, ки ба баста дар Java SE 8 илова карда шудааст.java.util.function
Қимати “ true ” ва “ false ” -ро месанҷад);map(Function mapper)
имкон медиҳад, ки функсияеро эҷод кунем, ки бо он мо ҳар як элементро тағир медиҳем ва минбаъд онро гузаред (Интерфейси функсионалӣFunction<T,R>
вазифаи гузаришро аз an objectи навъи T ба an objectи навъи R ифода мекунад)flatMap(Function<T, Stream<R>> mapper)
- чунон ки дар мавридиmap
, онҳо барои табдил додан ба ҷараёни ибтидоӣ истифода мешаванд.
[stream1,stream2,stream3,stream4] => stream
:
String[] array = {"Java", "Ruuuuussshhh"};
Stream<String> streamOfArray = Arrays.stream(array);
streamOfArray.map(s->s.split("")) //Convert the word to an array of letters
.flatMap(Arrays::stream).distinct() //aligns each generated thread into a single thread
.collect(Collectors.toList()).forEach(System.out::println);
Дар ҳоле ки map
он ба рӯйхати риштаҳо табдил меёбад (дақиқтар <Stream>
риштаҳо) [stream1,stream2,stream3,stream4] =>Stream.of(stream1,stream2,stream3,stream4)
:
String[] array = {"Java", "Ruuuuussshhh"};
Stream<String> streamOfArray = Arrays.stream(array);
streamOfArray.map(s->s.split("")) //Convert the word to an array of letters
.map(Arrays::stream).distinct() //Make the array into a separate thread
.collect(Collectors.toList()).forEach(System.out::println);
Фарқияти дигар дар муқоиса бо map
, шумо метавонед як элементро ба сифр, як ё бисёри дигар табдил диҳед. Барои табдил додани як элемент ба унсурҳои сифр, шумо бояд null
, ё ҷараёни холӣ баргардонед. Барои табдил додан ба як элемент, шумо бояд ҷараёнро аз як элемент баргардонед, масалан, тавассути Stream.of(x)
. Барои баргардонидани якчанд элемент, шумо метавонед бо ин элементҳо бо ҳар роҳ ҷараён эҷод кунед. Як усули flatMap, аммо барои Double, Integer ва Long:
- flatMapToDouble (харитасози функсия)
- flatMapToInt (харитасози функсия)
- flatMapToLong (Харитасози функсия)
Stream.of(2, 3, 0, 1, 3)
.flatMapToInt(x -> IntStream.range(0, x))
.forEach(System.out::print);// 010120012
-
IntStream.range(0,x) – унсурҳоро аз 0 (бо назардошти) то x (на фарогир) ба ҷараён мебарорад;
харита:
Stream.of(2, 3, 0, 1, 3) .map(x -> IntStream.range(0, x)) .forEach(System.out::print);//list of streams (streams);
-
limit(long maxSize) - ҷараёнро аз рӯи шумораи элементҳо маҳдуд мекунад:
stream.limit(5).forEach(x -> System.out.println(x));
-
гузаред (дароз n) - гузаред n элемент:
stream.skip(3).forEach(x -> System.out.println(x));
-
мураттаб ()
- sorted(Муқоисакунанда) - ҷараёнро ба навъҳо ҷудо мекунад (ба монанди TreeMap мураттаб кардан):
stream.sorted().forEach(x -> System.out.println(x));
-
distinct() — ҷараёнро барои нотакрор будани элементҳо тафтиш мекунад (такрорҳои элементҳоро нест мекунад);
-
dropWhile(Predicate предикат) - элементҳоеро, ки шартро қонеъ мекунанд (дар java 9 пайдо шудааст, Интерфейси функсионалии Predicate<T> месанҷад, ки риояи шарти муайянро месанҷад. Агар он иҷро шавад, ҳақиқӣ бармегардад. Ифодаи лямбда an objectи аз T-ро ҳамчун параметр нависед:
Predicate<Integer> isPositive = x -> x > 0; System.out.println(isPositive.test(3)); // true System.out.println(isPositive.test(-9)); // false
-
forEach(Амали истеъмолӣ) - шабеҳи барои ҳар як (Consumer<T> ягон амалро дар an objectи навъи T бидуни баргардонидани чизе иҷро мекунад);
-
count() - шумораи унсурҳои ҷараёнро бармегардонад:
System.out.println(stream.count());
-
ҷамъоварӣ(Коллектори коллекторӣ) – усул ҳамаи элементҳоро дар рӯйхат, маҷмӯи ё коллексияи дигар ҷамъ мекунад, унсурҳоро мувофиқи ягон меъёр гурӯҳбандӣ мекунад, ҳама чизро ба сатр муттаҳид мекунад ва ғайра:
List<String> list = Stream.of(“One”, “Two”, “Three”).collect(Collectors.toList());
-
collect(Supplier supplier, BiConsumer accumulator, BiConsumer combiner)
— ҳамон тавре ки ,collect(collector)
танҳо параметрҳо барои роҳат тақсим карда мешаванд (supplier
an objectҳои (контейнерҳои) навро таъмин мекунад, масаланnew ArrayList()
,accumulator
ба контейнер элемент илова мекунад,combiner
қисмҳои ҷараёнро якҷоя мекунад); -
кам кардан(T identity, BinaryOperator accumulator) - ҳамаи элементҳои ҷараёнро ба як an object табдил медиҳад (ҷамъи ҳамаи элементҳоро ҳисоб кунед ё элементи минималиро пайдо кунед), аввал an object
identity
ва элементи якуми ҷараён гирифта мешаванд, функсия татбиқ карда мешавад.accumulator
ваidentity
натичаи он мегардад. Сипас ҳама чиз барои унсурҳои боқимонда идома меёбад.int sum = Stream.of(1, 2, 3, 4, 5).reduce(10, (acc, x) -> acc + x);// = 25
-
reduce(BinaryOperator accumulator)
— ҳамон усуле, ки дар боло зикр шудааст, аммо усули аввала мавҷуд нестidentity
, он унсури аввалини ҷараён астOptional min(Comparator comparator)
Макс (Муқоисакунандаи муқоиса) ҷузъҳои ҳадди ақал/максимумро дар асоси муқоисакунандаи гузашта ҷустуҷӯ мекунад; -
findFirst()
– унсури якуми ҷараёнро берун мекунад:Stream.of(1, 2, 3, 4, 9).findFirst();
-
allMatch(Predicate predicate)
— ҳақиқӣ бар мегардонад , агар ҳамаи унсурҳои ҷараён шартро қонеъ гардонанд. Агар ягон элементе дучор шавад, ки натиҷаи даъвати функсияи предикат false аст , оператор сканеркунии элементҳоро қатъ мекунад ва баргардонидани false :Stream.of(1, 2, 3, 4, 9).allMatch(x -> x <= 7);//false
-
anyMatch(Predicate predicate)
— ҳақиқӣ бармегардад , агар ақаллан як унсури ҷараён шартро қонеъ гардонадpredicate
:Stream.of(1, 2, 3, 4, 9).anyMatch(x -> x >= 7);//true
-
noneMatch(Predicate predicate)
— ҳақиқӣ бармегардад , агар аз тамоми унсурҳои ҷараён гузашта, ҳеҷ яке аз онҳо шартро қонеъ накунадpredicate
:Stream.of(1, 2, 3, 4, 9).noneMatch(x -> x >= 7);//false
Collectors
:
-
toList()
- элементҳоро ҷамъ мекунадList
:List<Integer> list = Stream.of(99, 2, 3).collect(Collectors.toList());
-
toSet()
— элементҳоро дар маҷмӯа ҷамъ мекунад:Set<Integer> set = Stream.of(99, 2, 3).collect(Collectors.toSet());
-
counting()
— Шумораи элементҳоро ҳисоб мекунад:Long count = Stream.of("1", "2", "3", "4").collect(Collectors.counting());
-
joining()
-
joining(CharSequence delimiter)
-
joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix)
— элементҳоро дар як сатр ҷамъ мекунад. Илова бар ин, шумо метавонед ҷудокунанда, инчунин префикс ва суффиксро барои тамоми пайдарпай муайян кунед:String a = Stream.of("s", "u" ,"p", "e", "r").collect(Collectors.joining()); System.out.println(a); // super String b = Stream.of("s", "u", "p", "e", "r").collect(Collectors.joining("-")); System.out.println(b); // s-u-p-e-r String c = Stream.of("s", "u", "p", "e", "r").collect(Collectors.joining(" -> ", "[ ", " ]")); System.out.println(c); // [ s -> u -> p -> e -> r ]
-
summingInt(ToIntFunction mapper)
-
summingLong(ToLongFunction mapper)
-
summingDouble(ToDoubleFunction mapper)
- коллекторе, ки an objectҳоро ба int/long/duble табдил медиҳад ва маблағи онро ҳисоб мекунад.
GO TO FULL VERSION