日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java8函数式编程(3)--规约操作

發布時間:2024/4/13 java 73 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java8函数式编程(3)--规约操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

規約操作(reduction operation)又被稱作折疊操作(fold),是通過某個連接動作將所有元素匯總成一個匯總結果的過程。元素求和、求最大值或最小值、求出元素總個數、將所有元素轉換成一個列表或集合,都屬于規約操作。Stream類庫有兩個通用的規約操作reduce()和collect(),也有一些為簡化書寫而設計的專用規約操作,比如sum()、max()、min()、count()等。

reduce

reduce操作可以實現從一組元素中生成一個值,sum()、max()、min()、count()等都是reduce操作,將他們單獨設為函數只是因為常用。reduce()的方法定義有三種重寫形式:

Optional<T> reduce(BinaryOperator<T> accumulator) T reduce(T identity, BinaryOperator<T> accumulator) <U> U reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)

reduce()最常用的場景就是從一堆值中生成一個值。

reduce最終處理會封裝成一個AccumulatingSink。

public static <T> TerminalOp<T, Optional<T>>makeRef(BinaryOperator<T> operator) {Objects.requireNonNull(operator);class ReducingSinkimplements AccumulatingSink<T, Optional<T>, ReducingSink> {private boolean empty;private T state;public void begin(long size) {empty = true;state = null;}@Overridepublic void accept(T t) {if (empty) {empty = false;state = t;} else {state = operator.apply(state, t);}}@Overridepublic Optional<T> get() {return empty ? Optional.empty() : Optional.of(state);}@Overridepublic void combine(ReducingSink other) {if (!other.empty)accept(other.state);}}return new ReduceOp<T, Optional<T>, ReducingSink>(StreamShape.REFERENCE) {@Overridepublic ReducingSink makeSink() {return new ReducingSink();}};}

?

collect

收集器(Collector)是為Stream.collect()方法量身打造的工具接口(類)。將一個Stream轉換成一個容器(或者Map)需要做以下工作:

  • 目標容器是什么?是ArrayList還是HashSet,或者是個TreeMap。
  • 新元素如何添加到容器中?是List.add()還是Map.put()。
  • 多個部分結果如何合并成一個。
  • collect()方法定義為

    <R> R collect(Supplier<R> supplier,BiConsumer<R, ? super T> accumulator,BiConsumer<R, R> combiner);

    三個參數依次對應上述三條分析。不過每次調用collect()都要傳入這三個參數太麻煩,收集器Collector就是對這三個參數的簡單封裝,所以collect()的另一定義為

    <R, A> R collect(Collector<? super T, A, R> collector);

    Collectors工具類可通過靜態方法生成各種常用的Collector。舉例來說,如果要將Stream規約成List可以通過如下兩種方式實現:

    // 將Stream規約成List Stream<String> stream = Stream.of("I", "love", "you", "too"); List<String> list = stream.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);// 方式1 //List<String> list = stream.collect(Collectors.toList());// 方式2 System.out.println(list);

    通常情況下我們不需要手動指定collect()的三個參數,而是調用collect(Collector<? super T,A,R> collector)方法,并且參數中的Collector對象大都是直接通過Collectors工具類獲得。實際上傳入的收集器的行為決定了collect()的行為

    生成Collection

  • Collectors.toList()

  • Collectors.toSet()

  • Collectors.toCollection(Supplier<C> collectionFactory)

  • 生成Map

  • 使用Collectors.toMap()生成的收集器,用戶需要指定如何生成Map的key和value。
  • 使用Collectors.partitioningBy()生成的收集器,對元素進行二分區操作時用到。
  • 使用Collectors.groupingBy()生成的收集器,對元素做group操作時用到。
  • groupingBy()允許我們對元素分組之后再執行某種運算,比如求和、計數、平均值、類型轉換等。這種先將元素分組的收集器叫做上游收集器,之后執行其他運算的收集器叫做下游收集器(downstream Collector)。

    ?

    總結

    以上是生活随笔為你收集整理的Java8函数式编程(3)--规约操作的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。