我有ArrayList<Integer>
,元素数量均匀。如何使用Stream.forEach
一次解析2个值?
x.forEach((a, b) -> System.out.println(a.toString() + "-" + b.toString());
这不起作用。
答案 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)
如果您想使用流来使用流,您可以:
这里的问题是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