任何中间步骤都会影响整个流管道。您的愿望背后没有可识别的规则,即该
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属于同一作用域,这与链式流操作不同。



