【问题标题】:Any filter-like lambda operation which does not discard?任何不会丢弃的类似过滤器的 lambda 操作?
【发布时间】:2017-02-03 17:02:35
【问题描述】:

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

  assertEquals(Arrays.asList(1,2,3).stream()
                                   .noDiscardingFilter(x -> x!=1)
                                   .map(x -> x*10)
                                   .collect(Collectors.toList()),  
                Arrays.asList(1,20,30)
              )

这是一个例子,我不需要回答如何解决这个特定问题,这只是一个例子来展示我追求的是什么。

【问题讨论】:

  • 为什么不在 map() 中间操作中这样做?
  • 就问有没有这样的操作或技巧
  • 我不需要回答如何解决这个问题,这只是一种实用的方式来展示我很乐意了解的花哨的东西 .那么,您能否为我们定义/量化 fancy 的含义?
  • @CKing:我认为,它是关于分离谓词和函数,如果它们比这些简单的例子复杂得多,它们可能具有更高的相关性。
  • 没错!你成功了

标签: java lambda java-8 java-stream


【解决方案1】:

任何中间步骤都会影响整个流管道。您希望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 的谓词和函数属于同一范围,这与链式流操作不同。

【讨论】:

    【解决方案2】:

    如果您只想更改与过滤器匹配的条目,但保留其余条目。

    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()));
    

    【讨论】:

    • 没错。这就是想法。那是我最初的提议,但由于逻辑相当复杂,我想更好地询问是否有一些这样的过滤操作
    猜你喜欢
    • 1970-01-01
    • 2019-07-06
    • 2013-08-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多