【问题标题】:Streams in Java, can't figure this code outJava中的流,无法弄清楚这段代码
【发布时间】:2017-11-26 11:02:39
【问题描述】:

我找到了以下代码sn-p:

Function<Integer, Predicate<Integer>> smallerThan = x -> y -> y < x;
List<Integer> l = Arrays.asList(5, 6, 7, 23, 4, 5645,
    6, 1223, 44453, 60182, 2836, 23993, 1);

List<Integer> list2 = l.stream()
    .filter(smallerThan.apply(l.get(0)))
    .collect(Collectors.toList());

System.out.println(list2);

作为我收到的输出:

[4, 1]

考虑到我们只传递了一个参数smallerThan.apply(l.get(0)),这个例子中的smallerThan函数是如何工作的?

【问题讨论】:

  • smallerThan 是一个返回函数的函数。
  • 你可以像这样重写smallerThanx -&gt; (y -&gt; (y &lt; x))
  • Currying

标签: java lambda java-8 java-stream


【解决方案1】:

smallerThan 是一个Function,它接受单个Integer 并返回一个Predicate&lt;Integer&gt;Predicate&lt;Integer&gt; 是一个接受单个Integer 并返回一个boolean 的函数。

smallerThan.apply(l.get(0)) 返回一个 Predicate&lt;Integer&gt;,如下所示:

y -> y < l.get(0)

即如果传递给它的输入小于l.get(0),则返回true

当您将 Predicate 传递给 filter 时,您的 Stream 管道仅保留小于 l.get(0) 的元素。

您的管道可以重写为:

List<Integer> list2 = l.stream()
    .filter(y -> y < l.get(0))
    .collect(Collectors.toList());

由于l.get(0)5,因此您的管道会返回原始列表中小于5 的所有元素。

【讨论】:

    【解决方案2】:

    这被称为“currying”,在 Java 8 之前也可以通过匿名类实现,但它更加冗长。最终,它是一个Function,它返回一个Function,虽然在Java 中(还没有)传播,但在其他函数式语言中它被大量使用。

    【讨论】:

      【解决方案3】:

      函数smallerThan 接受一个数字并返回一个Predicate 对象,在这种情况下,我们将此谓词应用于流的每个元素。

      所以,l.get(0) 将检索列表l 的第一个值(5),然后我们将其传递给smallerThan 函数,该函数返回一个带有y -&gt; y &lt; x; 条件的谓词,其内容为“给定一个数字,如果小于 5,则返回 true” 因此输出为 [4, 1]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多