Looking for java Keywords? Try Ask4Keywords

Java Language Сокращение потока


пример

Сокращение - это процесс применения бинарного оператора к каждому элементу потока, чтобы привести к одному значению.

Метод sum() для IntStream является примером сокращения; он применяет дополнение к каждому члену потока, что приводит к одному окончательному значению: Уменьшение суммы

Это эквивалентно (((1+2)+3)+4)

Метод reduce Stream позволяет создать индивидуальное сокращение. Для реализации метода sum() можно использовать метод reduce :

IntStream istr;
    
//Initialize istr
    
OptionalInt istr.reduce((a,b)->a+b);

Optional версия возвращается, так что пустые потоки могут обрабатываться соответствующим образом.

Другим примером сокращения является объединение Stream<LinkedList<T>> в один LinkedList<T> :

Stream<LinkedList<T>> listStream;
    
//Create a Stream<LinkedList<T>>
    
Optional<LinkedList<T>> bigList = listStream.reduce((LinkedList<T> list1, LinkedList<T> list2)->{
    LinkedList<T> retList = new LinkedList<T>();
    retList.addAll(list1);
    retList.addAll(list2);
    return retList;
});

Вы также можете предоставить элемент идентификации . Например, элемент идентификации для сложения равен 0, как x+0==x . Для умножения единичный элемент равен 1, так как x*1==x . В вышеприведенном случае элемент идентификации представляет собой пустой LinkedList<T> , потому что если вы добавляете пустой список в другой список, список, который вы добавляете, не изменяется:

Stream<LinkedList<T>> listStream;

//Create a Stream<LinkedList<T>>

LinkedList<T> bigList = listStream.reduce(new LinkedList<T>(), (LinkedList<T> list1, LinkedList<T> list2)->{
    LinkedList<T> retList = new LinkedList<T>();
    retList.addAll(list1);
    retList.addAll(list2);
    return retList;
});

Обратите внимание, что, когда предоставляется элемент идентификации, возвращаемое значение не обернуто в Optional -if, вызываемый в пустом потоке, reduce() вернет элемент идентификации.

Бинарный оператор также должен быть ассоциативным , что означает (a+b)+c==a+(b+c) . Это связано с тем, что элементы могут быть уменьшены в любом порядке. Например, приведенное выше сведение может быть выполнено следующим образом:

Сокращение других сумм

Это сокращение эквивалентно записи ((1+2)+(3+4)) . Свойство ассоциативности также позволяет Java сокращать Stream параллельно - часть потока может быть уменьшена каждым процессором, причем сокращение объединяет результат каждого процессора в конце.