常見場景圖示
我們常見使用場景:累加、求最大值 如圖示 累加:
最大值
reduce
中的BiFunction
和BinaryOperator
是什麼
reduce定義如下: T reduce(T identity, BinaryOperator<T> accumulator);
首先了解一下BiFunction
和BinaryOperator
帶有Binary
和Bi
關鍵字都是二元運算(就是謂詞帶有 有兩個形參)
BiFunction
函式式介面如下: 傳入 T型別變數t U型別變數u 返回R型別變數
@FunctionalInterface // (T t,U u)->R public interface BiFunction<T, U, R> { R apply(T t, U u); }
BinaryOperator
函式式介面如下: 繼承BiFunction 形參型別和返回型別相同
@FunctionalInterface public interface BinaryOperator<T> extends BiFunction<T,T,T> { }
理解reduce
reduce常見的定義方式:
T reduce(T identity, BinaryOperator accumulator);
Optional<T> reduce(BinaryOperator<T> accumulator);
下面詳細解釋
T reduce(T identity, BinaryOperator accumulator);
第一個引數傳入T型別值,第二分謂詞 (T t,T t)->T
返回值型別為T
通俗點總結: 一個初始值 一個Lambda來把兩個流元素結合起來併產生一個新值
常用:累加、累積
Optional reduce(BinaryOperator accumulator);
謂詞 (T t,T t)->T
返回值型別為T
Optional容器類表示一個值存在或者不存在,避免和null檢查
reduce要考慮新的值和下一個元素,將流中的第一個元素作為初始值,比較產生最大值,然後繼續和下一個元素比較。
常用:最大值,最小值
程式碼舉例
最開始的圖示的程式碼如下:
累加:
List<Integer> integers = Arrays.asList(4, 5, 3, 9); Integer reduce = integers.stream().reduce(0, (a, b) -> a + b); System.out.println("求和:"+reduce); //求和:21
求最大值:
List<Integer> integers = Arrays.asList(4, 5, 3, 9); Optional<Integer> reduce = integers.stream().reduce(Integer::max); System.out.println("最大值:" + reduce.get()); //最大值:9