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

将流分成具有N个元素的子流

锺离明煦
2023-03-14

在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个流也是如此,这将是非常丑陋和只写的。

共有2个答案

翁硕
2023-03-14

例如:

<T> Stream<Stream<T>> split(Stream<T> stream, int n) {
  final var it = stream.iterator();
  final Stream.Builder<Stream<T>> result = Stream.builder();
  while (it.hasNext()) {
    final Stream.Builder<T> buf = Stream.builder();
    for (int i = 0; i < n && it.hasNext(); i++) {
      buf.accept(it.next());
    }
    result.accept(buf.build());
  }
  return result.build();
}


Stream<Integer> s = Stream.of(1,2,3,4,5);
Stream<Stream<Integer>> separated = split(s, 2);
separated.map(x -> x.collect(Collectors.toList())).forEach(System.out::println);
[1, 2]
[3, 4]
[5]
沈宇定
2023-03-14

您无法轻松直接地将拆分为2个或更多列。唯一的方法是程序性的方法,包括由夫妇将元素收集到列表,然后将它们再次映射回

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) {
        temp.add(temp2);
    }
}
Stream<Stream<Integer>> stream = temp.stream().map(i -> i.stream());

如你所见,这是一条很长的路,不值得。将配对存储在< code>List而不是< code>Stream中不是更好吗?java-stream API不是用于数据存储,而是用于数据处理。

 类似资料:
  • 问题内容: 在JavaScript中,我想不出代码来从n个数组(其中m个元素)中生成组合的代码。对于其他语言,我也曾见过类似的问题,但答案包含了我不确定如何翻译的语法或库魔术。 考虑以下数据: 3个数组,其中包含不同数量的元素。我想做的是通过组合每个数组中的一项来获得所有组合。 例如: 等等。 如果数组的数目是固定的,则很容易进行硬编码实现。但是数组的数量可能会有所不同: 任何帮助将非常感激。 问

  • 问题内容: 我想知道是否有替代 使用 流 ? 问题答案: 定制收集器可以这样写: 并像这样使用它:

  • 假设我有这样一个列表: 是否可以使用Java8流从该列表中每隔一秒获取一个元素以获得以下内容? 或者甚至每三个元素? 基本上,我正在寻找一个函数来获取流的每n个元素:

  • 问题内容: 我正在寻找一个选择器,如果它们具有特定的子元素,它将选择所有元素。例如,选择所有带孩子的人。 可能? 问题答案: 如果元素包含特定的子元素,是否可以选择? 不幸的是还没有。 在CSS2和CSS3选择器的规格不允许任何形式的亲本选配。 关于规格变更的注意事项 从现在开始,这是关于此帖子准确性的免责声明。CSS中的父选择器已经讨论了很多年。由于尚未达成共识,因此变化不断发生。我将尝试使此答

  • DocBook 最基本的元素是 para 和块元素,比它们大的是结构元素,比它们小的是行内元素。 元素 说明   sect1 节 section 节 para 段落 formalpara 带标题段落 sect1-5逐级嵌套 可无限嵌套 简单段落 复杂段落,可以带标题 section其实属于结构元素,它的标题会被收录到目录中。把它们放在这里,因为它们是放进单独文件的最佳元素