假设我们有一个集合(或流?)
{"1","2","3","4"...}
现在我们想要两个元素并组成一对像这样的
{{"1","2"}, {"2","3"},{"3","4"}..}
我们知道如何以丑陋的方式(循环)。
我想知道我们如何用java 8流做到这一点?
因为java流和被动扩展中的方法几乎相同(都是monad)我认为可能有类似RX .pick(2)
的东西会在2个元素到达时触发事件......
答案 0 :(得分:0)
它也不漂亮,但你可以用收藏家来做。我在里面使用了带有数组的ArrayList,但如果需要,你可以使用不同的中间集合类型。
我在这里做的是一个收集器,它将每个项目添加为添加到累加器的最后一个数组的第二项,并作为将添加到累加器的新数组的第一项。
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
ArrayList<Integer[]> pairs =
stream.collect(
() -> new ArrayList<>(),
(acc, next) -> {
if(acc.isEmpty()) {
acc.add(new Integer[] {next, null});
} else {
acc.get(acc.size() - 1)[1] = next;
acc.add(new Integer[] {next, null});
}
},
ArrayList::addAll
);
pairs.forEach(a -> System.out.println(a[0] + ", " + a[1]));
//-> 1, 2
//-> 2, 3
//-> 3, 4
//-> 4, 5
//-> 5, 6
//-> 6, null
答案 1 :(得分:0)
可以使用IntStream.range
循环播放。
String[] str = {"1", "2", "3", "4"};
final String[][] result = IntStream.range(0, str.length - 1)
.mapToObj(i -> new String[]{str[i], str[i + 1]})
.toArray(String[][]::new);
结果包含{{"1", "2"}, {"2", "3"}, {"3", "4"}}
。