簡體   English   中英

Java 8 stream.reduce()與組合器

[英]Java 8 streams.reduce() with combiner

我的問題是我想細分以下代碼

我有一張地圖,我想用以下reduce()函數用地圖的值替換某些字符串:

Map<String, String> environmentMap = new HashMap<>();

Function<String, String> replaceFunction = environmentMap.entrySet()
.stream()
.reduce
(Function.identity(),
(function,entrySet) -> stringToReplace -> function.apply(stringToReplace.replaceAll(entrySet.getKey(),entrySet.getValue(),
Function::andThen);

不知何故我對replaceFunction部分感到困惑,但讓我根據自己的理解將其分解。

  1. environmentMap.entrySet().stream()將創建Entry<String,String>的流。
  2. 我正在使用的reduce()方法采用一個標識,一個累加器和一個組合器。
  3. 由於我沒有使用並行流,因此我考慮省略組合器,但是編譯器將引發錯誤。 有什么辦法可以將這個累加器轉換成BinaryOperator<T>嗎?
  4. Function.identity()將始終返回一個返回輸入參數的Function。 在這種情況下,類型為String
  5. 引入BiFunction的第二個參數是我很困惑的事情之一。 (function,entrySet) -> stringToReplace -> function.apply(stringToReplace.replaceAll(entrySet.getKey(),entrySet.getValue()
  6. Function ::然后在此過程中做什么?
  7. 最后, BiFunction<T, U, R>的返回類型Function<String,String>來自BiFunction<T, U, R>
Function<String, String> replaceFunction = environmentMap.entrySet()
            .stream()
            .reduce(Function.identity(),
                    (function,entrySet) -> stringToReplace -> function.apply(stringToReplace.replaceAll(entrySet.getKey(),entrySet.getValue())),
                            Function::andThen);
  1. environmentMap.entrySet().stream()將創建Entry<String,String>的流。
  2. 我正在使用的reduce()方法采用一個標識,一個累加器和一個Combiner.item

    到此為止您是正確的,但是標識,累加器和組合器的解析如下:

    • identity - Function.identity()被解析為Function<String, String>
    • 累加器 - (function,entrySet) -> stringToReplace -> function.apply(stringToReplace.replaceAll(entrySet.getKey(),entrySet.getValue()))

      這是下面的部分

       `stringToReplace -> function.apply(stringToReplace.replaceAll(entrySet.getKey(),entrySet.getValue()))` 

      解析為Function<String, String>

      這樣整個累加器就解決了

       `BiFunction<Function<String,String>, Entry<String,String>,Function<String,String>` 
    • 組合器 Function::andThen解析為BinaryOperator<Function<String,String>, Function<String,String>>

因此,在6和7中回答您的問題, Function::andThen充當組合器; 7是如上所述的累加器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM