使用多个值来传递foreach?

时间:2016-03-21 07:26:57

标签: java foreach java-stream

我有ArrayList<Integer>,元素数量均匀。如何使用Stream.forEach一次解析2个值?

x.forEach((a, b) -> System.out.println(a.toString() + "-" + b.toString());

这不起作用。

3 个答案:

答案 0 :(得分:1)

您可以将以下帮助方法添加到项目的某个实用程序类中:

public static <T> void forPairs(List<T> list, BiConsumer<T, T> action) {
    IntStream.range(0, list.size()/2)
             .forEach(i -> action.accept(list.get(i*2), list.get(i*2+1)));
}

并像这样使用它:

List<Integer> list = Arrays.asList(1, 3, 5, 2, 1, 6);
forPairs(list, (a, b) -> System.out.println(a + "-" + b));

答案 1 :(得分:1)

如果您想使用流来使用流,您可以:

  1. 编写一个非常困难的自定义收集器来收集对,然后重新流式传输并执行操作,或
  2. 迭代索引而不是元素,这里提供了答案(但它不是您感兴趣的对象流)。
  3. 这里的问题是Streams被设计用于没有副作用的无状态管道操作,而不是用于组合元素(除了一些例外)。 docs非常精细。

    在这里使用iterator会更合适:

    Iterator<Integer> iterator = Arrays.asList(1, 2, 3, 4, 5, 6).iterator();
    while(iterator.hasNext()) {
        System.out.println(iterator.next().toString() + "-" + iterator.next().toString());
    }
    

    注意:如果列表的大小为奇数,则会抛出NoSuchElementException。如果需要,可以轻松编写防御性检查。

答案 2 :(得分:0)

这样可以解决问题:

IntStream.range(0, list.size() - 1)
.filter(i -> i % 2 == 0)
.forEach(i -> System.out.println(list.get(i) + "-" + list.get(i + 1)));

它将从列表[1,2,3,4,5,6]产生以下输出:

1-2
3-4
5-6