当前位置: 首页 > 知识库问答 >
问题:

流api简化方法

卫子平
2023-03-14

我正在学习流api,我被流的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

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

这会导致奇怪的输出。请帮我找出这里出了什么问题。

共有2个答案

酆君墨
2023-03-14

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

虚拟值不等于字符串连接的有效标识,因为虚拟值不等于值。用这样的东西替换应该可以:

    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;
    }

作为一种选择,假设“虚拟”只是因为减少期望提供初始状态而被包括在内,这样的事情可能对您的目的有用:

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

or

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

编辑-为什么reduce的行为是这样的?

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

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

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

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

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

蒙华翰
2023-03-14

您也可以使用以下不带减少,

Stream<String> data = Stream.of("a", "b", "c", "d", "e", "f");
String output = data.parallel().collect(Collectors.joining(" : ", "dummy : ", ""));
 类似资料:
  • 假设您希望对迭代器的元素进行流式处理;让我们使用一个的具体示例,它实现了。 给定,比方说: 在给定的情况下,JDK中是否有一个工厂方法返回?

  • 假设我要计算8的平方根。如下所示,有两种方法可以显示结果: 我认为获得第二个解决方案的最好方法是: 我想在我的Java应用程序中尝试do display 2√2而不是2828 427...所以我想按照这些步骤开发一个类。让我们考虑8的平方根。 null 我想我可以在一个数组中存储每个基数的指数,然后尝试以某种方式导出它。你有什么建议吗?

  • 我有一颗豆子和一条小溪 并且希望对返回TokenBag的另一个对象流的流应用一些中间操作。在这个例子中必须有两个:("a",3),("b",3)和("a",2)。 请把它看作一个非常简单的例子。在现实中,会有比仅仅计算一行中相同的值更复杂的逻辑。事实上,我试图设计一个简单的解析器,它接受一个令牌流并返回一个对象流。 另外,请注意,它必须保持为一个流(没有中间累加),而且在本例中,它必须在一行中真正

  • aiohttp.web.Request.content和aiohttp.ClientResponse.content都使用流来接受数据,同时也是流形式的API属性。 class aiohttp.StreamReader    流内容读取器    除了已经存在的aiohttp.web.Request.content和aiohttp.ClientResponse.content用于读取原始内容的Str

  • 我已经阅读了一些关于如何自定义处理API请求验证错误的答案和问题。然而,这一切似乎有点过头了。我的endpoint中有一个简单的对象: 发送空值或空值时引发的错误是: 这条信息传递给前端有点太多了。他们需要的只是“目标群体不能是空白的”。我想将上面的信息转换为以下内容: 我怎样才能做到这一点?

  • 问题内容: 我在PyQt中有一个带有功能的GUI 。容易想象,当新图像应添加到QListWidget中时被调用。为了检测文件夹中的新图像,我使用了with来检测文件夹中的文件更改,然后该线程直接调用。 出于线程安全的原因,这会产生不应在gui线程之外调用的警告。 使此线程安全的最佳和最简单的方法是什么?QThread?信号/插槽?QMetaObject.invokeMethod?我只需要从线程传递