【发布时间】:2019-11-10 09:54:12
【问题描述】:
使用以下代码:
public class Main {
public static void main(String[] args) {
final List<Integer> items =
IntStream.rangeClosed(0, 23).boxed().collect(Collectors.toList());
final String s = items
.stream()
.map(Object::toString)
.collect(Collectors.joining(","))
.toString()
.concat(".");
System.out.println(s);
}
}
我明白了:
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23 .
我想做的是每10个项目打破一次,以获得:
0,1,2,3,4,5,6,7,8,9,
10,11,12,13,14,15,16,17,18,19,
20,21,22,23.
我在谷歌搜索后尝试了很多东西但没有成功! 你能帮帮我吗?
谢谢,
奥利维尔。
【问题讨论】:
-
编写自己的 Spliterator 来获取流,对元素进行分组,并将其自身包装在一个新的 Stream 中是通常的方法。但是,对于这个特定示例,您还可以编写自己的收集器/归约器,以生成数字列表的列表。收集下一个数字时,检查最后一个列表是否还有空间,否则添加一个新的空列表。然后流式传输结果,用逗号连接列表的元素,用换行符连接结果字符串。缺点是您会生成一个包含所有元素的集合,这可能是内存问题(Spliterator 方法不会)。
-
顺便说一下,Holger 对@AlexisC 问题的回答的最后一部分。提到的以非常简洁的方式产生了我提到的减少。因此,如果您可以忍受创建中间集合,这是一个非常酷的解决方案。
-
我使用 StreamEx 的 groupRuns 的两分钱:
IntStreamEx.rangeClosed(0, 23).boxed().groupRuns((i1, i2) -> i1 / 10 == i2 / 10).collect(Collector.of(() -> new StringJoiner(System.lineSeparator(), "", "."), (joiner, numbers) -> joiner.add(String.join(",", numbers.stream().map(String::valueOf).toArray(String[]::new))), StringJoiner::merge, StringJoiner::toString));
标签: list java-8 java-stream chunked