带有组合器的Java 8 streams.reduce()

时间:2018-03-13 08:43:04

标签: java lambda java-8 java-stream

我的问题是,我希望细分以下代码

我有一张地图,我希望使用以下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. 的流
  3. 我正在使用的reduce()方法带有标识符,累加器和合并器。
  4. 由于我没有使用并行流,我想省略组合器,但编译器抛出错误。有什么方法可以将这个累加器转换为BinaryOperator<T>
  5. Function.identity()将始终返回一个返回输入参数的Function。在String
  6. 类型的情况下
  7. 第二个引入BiFunction的论点是我困惑的事情之一。 (function,entrySet) -> stringToReplace -> function.apply(stringToReplace.replaceAll(entrySet.getKey(),entrySet.getValue()
  8. Function :: andThen在此过程中做了什么?
  9. 最后,Function<String,String>中的返回类型BiFunction<T, U, R>来自哪里?

1 个答案:

答案 0 :(得分:0)

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. 的流
  3. 我正在使用的reduce()方法带有标识,累加器和combiner.item

    直到你是对的,但身份,累加器和合并器解析如下:

    • 身份 - 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>>

  4. 因此,要回答6和7中的问题,Function::andThen充当组合者; 7是我上面描述的累加器。