【问题标题】:Split stream into substreams with N elements将流拆分为具有 N 个元素的子流
【发布时间】:2016-12-13 17:43:11
【问题描述】:

我们能否以某种方式将流拆分为 Java 中不超过 N 个元素的子流? 例如

Stream<Integer> s = Stream.of(1,2,3,4,5);
Stream<Stream<Integer>> separated = split(s, 2);
// after that separated should contain stream(1,2), stream(3,4), stream(5)

由两个流拆分的解决方案仅对 2 个流是正确的,对于 N 个流也是如此,这将非常丑陋且只写。

【问题讨论】:

  • 不,你不能,不是真的。收集到实际的文字集合中,而不是流,这是可行的。
  • 这是一个反复出现的XY Problem。与其问如何拆分 Stream,不如想想你真正想用 Stream(s) 做什么。问,如何从 Stream 中得到想要的结果,而不是如何拆分 Stream。

标签: java java-8 java-stream


【解决方案1】:

您不能轻松直接地将 Stream 拆分为 2 个或更多 Streass。程序的唯一方法是由夫妻将元素收集到List,然后再次将它们映射回Stream

Stream<Integer> s = Stream.of(1,2,3,4,5);
List<Integer> list = s.collect(Collectors.toList());
int size = list.size();

List<List<Integer>> temp = new ArrayList<>();
List<Integer> temp2 = new ArrayList<>();

int index = 0;
for (int i=0; i<size; i++) {
    temp2.add(list.get(i));
    if (i%2!=0) {
        temp.add(temp2);
        temp2 = new ArrayList<>();
    }
    if (i == size - 1 && size%2!=0) {
        temp.add(temp2);
    }
}
Stream<Stream<Integer>> stream = temp.stream().map(i -> i.stream());

如您所见,这是一条很长的路,不值得。将这些对存储在List 而不是Stream 中不是更好吗? API 不用于数据存储,而是用于处理数据。

【讨论】:

    猜你喜欢
    • 2020-11-08
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2020-01-08
    • 2017-09-23
    • 1970-01-01
    • 2016-06-29
    相关资源
    最近更新 更多