繁体   English   中英

流api减少方法

[英]Stream api reduce method

我正在学习 Stream api 并且我坚持使用 Stream 的 reduce 方法。 我有一些字符串流,我想连接它们。 下面是我的代码片段:

Stream<String> data = Stream.of("a", "b", "c", "d", "e", "f");
String col = data.parallel().reduce("dummy",
        (t, u) -> {
            return t + " : " + u;
        },
        (a, b) -> {
            return a + b;
        });
System.out.println(col);
//Output: dummy : adummy : bdummy : cdummy : ddummy : edummy : f
//Expected: dummy : a : b : c : d : e : f

我不希望它们按顺序排列,但至少它们不应该有重复的“虚拟”字符串。

它导致一个奇怪的输出。 请帮我找出这里有什么问题。

上面包含的 reduce 不起作用的原因是因为 '标识值必须是组合器函数的标识。 这意味着对于所有 u,combiner(identity, u) 等于 u。 '

'dummy' 不是字符串连接的有效标识,因为 dummy + value 不等于 value。 用这样的东西替换应该可以工作:

    public static void main(String args[])
    {
        Stream<String> data = Stream.of("a", "b", "c", "d", "e", "f");
        System.out.println(data.parallel().reduce("", Test::accumulate));
    }

    private static String accumulate(String v1, String v2)
    {
        if(v1.isEmpty()) return v2;
        if(v2.isEmpty()) return v1;
        return v1 +":" + v2;
    }

作为替代方案,假设仅包含 'dummy' 是因为 reduce 期望提供初始状态,这样的事情可能适用于您的目的:

data.parallel().reduce((v1, v2) -> v1 +":" + v2).orElse("???");

or

data.parallel().collect(Collectors.joining(":"));

编辑 - 为什么减少这样的行为?

同时聚合数据时需要做出某些假设。 例如,流中元素的合并顺序不应影响结果的有效性。 为了解决这个问题,对可用于归约运算的函数类型有一定的限制。 一个限制是:

'标识值必须是组合器功能的标识。 这意味着对于所有 u,combiner(identity, u) 等于 u。

因此,至少我们可以说在功能上没有理由为什么在并行执行时不能将身份传递给所有元素。 至于为什么考虑以下可能有用:

  1. 如果只允许第一个元素与身份组合,从计算的角度来看,这意味着什么?
  2. 如果我也想立即开始处理第二个元素怎么办?

(有关更多详细信息,请参阅此答案: https : //stackoverflow.com/a/51290673/14294525

您也可以在不减少的情况下使用以下内容,

Stream<String> data = Stream.of("a", "b", "c", "d", "e", "f");
String output = data.parallel().collect(Collectors.joining(" : ", "dummy : ", ""));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM