一次从流中选择2个元素

时间:2015-02-20 05:21:12

标签: java java-8 java-stream

假设我们有一个集合(或流?)

{"1","2","3","4"...}

现在我们想要两个元素并组成一对像这样的

{{"1","2"}, {"2","3"},{"3","4"}..}

我们知道如何以丑陋的方式(循环)。

我想知道我们如何用java 8流做到这一点?

因为java流和被动扩展中的方法几乎相同(都是monad)我认为可能有类似RX .pick(2)的东西会在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"}}