java - 任何类似过滤器的 lambda 操作不会丢弃吗?

标签 java lambda java-8 java-stream

我基本上想做这样的事情:

  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/

相关文章:

java - 调用 Spring bean 的函数接口(interface)

java - spring mvc+ajax 获取点击数据

c++ - 在单个函数中混合 '__try' 和 'try' - 通过 Lambda

Haskell lambda 表达式和简单的逻辑公式

Python:为什么 lambda 在内联 if 中定义变量?

java - 如何将 NamedJdbcTemplate 与 Postgres 正则表达式一起使用

java - 对于模拟调用,相同的答案 10 次,然后使用 Mockito 进行另一个答案

Java 分割字符串

Java代码 "NumberFormat nf = NumberFormat.getInstance();"

java - Android:需要用户交互/输入的通知