首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ReactiveX Observable#scan的Java Stream等效项

ReactiveX Observable#scan的Java Stream等效项
EN

Stack Overflow用户
提问于 2018-06-20 04:58:04
回答 3查看 389关注 0票数 2

ReactiveX有一个非常简洁的名为Scan的运算符,它类似于reduce,只是它会发出每个中间累加器。

我该如何使用Java Streams来实现这一点呢?Stream#reduce不是我想要的,因为它返回T

代码语言:javascript
复制
T reduce(T identity, BinaryOperator<T> accumulator)

我想要的是返回Stream<T>,流的每一项都是每次调用accumulator时返回的T

代码语言:javascript
复制
Stream.of(1, 2, 3)
    .myScan(0, (accumulator, i) -> accumulator + i)
    .collect(Collectors.toList()); // [1, 3, 6]

我可以做一些很差劲的事情,比如减少一个List,然后再转换回一个Stream,但这很难看。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-20 05:11:18

流不支持此操作。您可以将其转换为迭代器,在那里执行,然后再转换回streams,但是streams没有内置的功能来执行此操作。

票数 1
EN

Stack Overflow用户

发布于 2018-06-21 01:49:41

试试StreamEx。我认为它提供了您想要的提取API:

代码语言:javascript
复制
List<Integer> result = StreamEx.of(1, 2, 3).scanLeft((i, j) -> i + j);
System.out.println(result); // [1, 3, 6]
票数 2
EN

Stack Overflow用户

发布于 2018-06-20 05:34:05

java-stream最大的问题是,它被高估了,被理解为一个神奇的解决方案,可以解决任何与集合略有关系的事情。

此API是为支持元素的顺序处理而构建的。没有任何类似Stream的方法来执行下面的代码片段。此外,该API不容易扩展。

以下是您正在谈论的内容:

代码语言:javascript
复制
List<Integer> list = new ArrayList<>();
Stream.of(1, 2, 3).reduce(0, (t, u) -> {
    final Integer s = t + u;
    list.add(s);
    return s;
});

System.out.println(list);   // prints [1, 3, 6]

下面是一个使用AtomicInteger的解决方法,它允许您在执行map(..)之后继续流式处理

代码语言:javascript
复制
AtomicInteger sum = new AtomicInteger(0);
List<Integer> list = Stream.of(1, 2, 3)
    .map(i -> sum.addAndGet(i))
    .collect(Collectors.toList()); 

System.out.println(list);  // prints [1, 3, 6]

有时你必须使用不同的方式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50936854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档