任何类似filter的lambda操作都不会丢弃?

我基本上想做的事情如下:

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  Function conditional( Predicate p, Function 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的谓词和函数属于同一范围,这与链式流操作不同。

如果您只想更改与filter匹配但保留其余条目的条目。

 assertEquals(Arrays.asList(-1, 1, 20, 30), Stream.of(-1, 1, 2, 3) .map(i -> i <= 1 ? i /* retain */ : 10 * i /* transform */) .collect(Collectors.toList()));