【问题标题】:Java 8 streams.reduce() with combiner带有组合器的 Java 8 streams.reduce()
【发布时间】:2018-08-21 10:37:54
【问题描述】:

我的问题是我想要以下代码的细分

我有一张地图,我想使用以下 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&lt;String,String&gt; 的流。
  2. 我正在使用的reduce() 方法采用标识、累加器和组合器。
  3. 由于我没有使用并行流,我想省略组合器,但编译器会抛出错误。有什么办法可以把这个累加器变成BinaryOperator&lt;T&gt;
  4. Function.identity() 将始终返回一个返回输入参数的函数。在这种情况下类型为String
  5. 接受 BiFunction 的第二个参数是我感到困惑的事情之一。 (function,entrySet) -&gt; stringToReplace -&gt; function.apply(stringToReplace.replaceAll(entrySet.getKey(),entrySet.getValue()
  6. Function::andThen 在这个过程中做了什么?
  7. 最后,BiFunction&lt;T, U, R&gt;中的返回类型Function&lt;String,String&gt;是从哪里来的??

【问题讨论】:

    标签: java lambda java-8 java-stream


    【解决方案1】:
    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&lt;String,String&gt; 的流。
    2. 我使用的reduce() 方法采用身份、累加器和combiner.item

      到此为止,您是对的,但是 identity、accumulator 和 combiner 得到如下解析:

      • 身份 - Function.identity() 被解析为 Function&lt;String, String&gt;
      • 累加器 - (function,entrySet) -&gt; stringToReplace -&gt; function.apply(stringToReplace.replaceAll(entrySet.getKey(),entrySet.getValue())).

        这里是以下部分,

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

        解析为Function&lt;String, String&gt;

        所以整个累加器被解析为

        `BiFunction<Function<String,String>, Entry<String,String>,Function<String,String>`
        
      • combiner - Function::andThen 被解析为 BinaryOperator&lt;Function&lt;String,String&gt;, Function&lt;String,String&gt;&gt;

    所以,要回答您在 6 和 7 中的问题,Function::andThen 充当组合器;和 7 是我上面描述的累加器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2015-07-22
      • 2016-06-19
      • 2016-10-26
      • 1970-01-01
      相关资源
      最近更新 更多