我基本上想做这样的事情:
assertEquals(Arrays.asList(1,2,3).stream()
.noDiscardingFilter(x -> x!=1)
.map(x -> x*10)
.collect(Collectors.toList()),
Arrays.asList(1,20,30)
)
这是一个例子,我不需要得到如何解决该特定问题的答案,这只是一个例子来展示我正在追求的奇特东西。
最佳答案
任何中间步骤都会影响整个流管道。您希望 noDiscardingFilter
步骤影响后续链接的 map
的操作,但不影响 collect
操作,但背后没有可识别的规则。如果你想要一个条件函数,这样实现会更清楚:
public static <T> Function<T,T> conditional(
Predicate<? super T> p, Function<T, ? extends T> f) {
return obj -> p.test(obj)? f.apply(obj): obj;
}
这可以用作
assertEquals(Stream.of(1, 2, 3)
.map(conditional(x -> x!=1, x -> x*10))
.collect(Collectors.toList()),
Arrays.asList(1, 20, 30)
);
或
Stream.of(1, 5, null, 3, null, 4)
.map(conditional(Objects::isNull, x -> 0)) // replacing null with default value
.forEach(System.out::println);
或
Stream.of(1, 5, null, 3, null, 4)
.map(conditional(Objects::nonNull, x -> x*10)) // null-safe calculation
.forEach(System.out::println);
请注意,在这些用例中,可以立即识别出传递给 conditional
的谓词和函数属于同一范围,这与链式流操作不同。
关于java - 任何类似过滤器的 lambda 操作不会丢弃吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42029357/