由於Guava version 22,您可以使用Streams.forEachPair
來完成你想要的東西:
Stream<String> strings = Stream.of("a", "b", "c", "d", "e", "f");
Stream<Long> indexes = Stream.iterate(0L, i -> i + 1L);
Streams.forEachPair(strings, indexes, (s, i) -> {
if (i % 3 == 0) {
System.out.println("Every 3rd element: " + s);
} else {
System.out.println(s);
}
});
這就形成了連續的無限流Long
元素,從0L
開始,並在內部將此流與strings
流拉到一起。 Streams.forEachPair
接受一個BiConsumer
,它接收每對元素,每個元素來自一個流,並根據索引是否爲第三元素來執行操作。
您可以抽象這更具有以下輔助方法:
forEachNthOrElse(
strings,
3,
s -> System.out.println("Every 3rd element: " + s),
System.out::println);
注:
static <T> void forEachNthOrElse(
Stream<T> stream,
int n,
Consumer<T> onNthElement,
Consumer<T> onAnyOther) {
Streams.forEachPair(
stream,
Stream.iterate(0L, i -> i + 1),
(t, i) -> {
Consumer<T> action = i % n == 0 ? onNthElement : onAnyOther;
action.accept(t);
});
}
而且,對於同樣的例子,你可以按如下方式使用它我不知道如果您需要始終執行System.out::println
操作,或者僅在元素不是第n個元素時才執行。我實施了BiConsumer
以執行一個動作或另一個。如果不是這種情況(即,如果你想爲第n個元素執行一個動作並始終執行另一個動作,即使是第n個元素),你應該相應地更改代碼。
ñ新方法,起來! –