API Stream

Дар гурӯҳ нашр шудааст
API Stream - 1

Stream API чист?

Stream API як роҳи нави кор бо сохторҳои додаҳо дар услуби функсионалӣ мебошад. Stream API (тафсири роҳҳое, ки як барномаи компютерӣ метавонад бо барномаи дигар муошират кунад) дар асл як ҷараёни додаҳо мебошад. Худи истилоҳи "ришта" дар барномасозӣ дар маҷмӯъ ва махсусан дар Java хеле норавшан аст.
API Stream - 1
Бо пайдоиши Java 8, Stream API ба барномасозон имкон дод, ки он чизеро, ки қаблан сатрҳои зиёди рамз мегирифтанд, хеле мухтасар нависад, яъне содда кардани кор бо маҷмӯаҳои додаҳо, бахусус, содда кардани филтр, ҷудокунӣ ва дигар амалиётҳои коркарди додаҳо. Агар шумо амалиёти фосилавӣ надошта бошед, шумо метавонед ва бояд аксар вақт бе ҷараён кор кунед, вагарна code нисбат ба бе ҷараён мураккабтар хоҳад буд.
API Stream - 2
Аз куҷо бояд сар кунам? Аз эҷоди як мисоли Stream, ки ба ҷамъоварӣ, массив ё усуле, ки ба мо лозим аст ва мувофиқи он маълумот аз куҷо гирифта мешавад, асос ёфтааст:
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);
	}
Роҳҳои имконпазири эҷоди ҷараён:
API Stream - 3
  • Ҷараёни холӣ:Stream.empty()
  • Ҷараён аз рӯйхат:list.stream()
  • Ҷараён аз харита:map.entrySet().stream()
  • Ҷараён аз массив:Arrays.stream(array)
  • Ҷараён аз унсурҳои муайяншуда:Stream.of("1", "2", "3")
Ғайр аз он, операторҳо вуҷуд доранд (аслан усулҳои синфи Stream) Операторҳоро ба ду гурӯҳ тақсим кардан мумкин аст:
  • Мобайнӣ (инчунин "танбал" номида мешавад) - коркарди унсурҳои воридотӣ ва баргардонидани ҷараён. Дар занҷири коркарди элементҳо метавонад бисёр операторҳои фосилавӣ бошанд.
  • Терминал ("терминал", инчунин "талаб" номида мешавад) - унсурҳоро коркард мекунад ва ҷараёнро қатъ мекунад, бинобар ин дар занҷир танҳо як оператори терминал мавҷуд буда метавонад.
Мисол:
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))ки дар навбати худ аз тамоми унсурҳои коллексияи ба он гузашташуда мегузарад ва онро намоиш медиҳад)
API Stream - 5
Нуқтаҳои муҳим:
  • То он даме, ки оператори терминал даъват карда нашавад, коркард оғоз намешавад. list.stream().filter(s -> s > 5)(аз рӯйхат ягон элементро намегирад);
  • Намунаи ҷараён наметавонад бештар аз як маротиба истифода шавад =( ;
  • API Stream - 6

    Аз ин рӯ, ҳар дафъае, ки он нав аст:

    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));
Баъд, биёед ба баъзе операторҳои миёнарав назар андозем:
API Stream - 7
  • 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 (Харитасози функсия)
Ва мисоли дигар барои муқоиса, flatMap:
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
Операторони терминал:
API Stream - 8
  • 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)танҳо параметрҳо барои роҳат тақсим карда мешаванд ( supplieran 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 табдил медиҳад ва маблағи онро ҳисоб мекунад.

Истинодҳои муфид: PS: шарм надоред, ки моро бо лайкҳо бор кунед ^ : ^
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION