【问题标题】:Lambda of Fluent API?Fluent API 的 Lambda?
【发布时间】:2021-02-06 20:21:21
【问题描述】:

尝试用 Stream API 中的匿名类替换 lambdas(如下代码),它工作正常。我想了解 test(T t) 方法所需的参数是如何生成的。

拉姆达

                list.stream()
                .map(String::length)
                .filter(t->t>4).count();

匿名类

                list.stream()//line1
                .map(String::length)
                .filter(new Predicate<Integer>() {
                    @Override
                    public boolean test(Integer t) {//line 5
                        
                        return t>4;
                    }
                }).count();

在使用 lambda 时,我们使用 lambda 表示法传递参数,但我不明白第 5 行的 Integer t 是如何生成的。是因为Stream中的Fluent API还是因为函数接口(lambda)?

编辑:我很清楚lambda 版本,不明白anonymous class 版本是如何工作的?换句话说,它可以在Java 1.7 中工作吗(如果我们写了类似于Stream API 的东西,我们就不会有lambdas)。

编辑:对于任何像我一样困惑的人,请查看https://github.com/fmcarvalho/quiny,一些聪明人对 Stream API 的简化实现

【问题讨论】:

  • 是的,它可以在 Java 7 中使用匿名类。 (一些第三方库正是这样做的,例如 Guava 的 FluentIterable。)
  • 好的,谢谢。那么它是负责此功能的 Fluent API 吗?
  • 我的意思是,真正负责的不是“流利的 API”。只是……这些语言功能是如何工作的。
  • 好的,java中的哪个特性,方法链?但是我没有看到这里使用了这个关键字,它通常用于方法链接。
  • 方法链实际上并不是一种语言特性,它只是一种使用语言的方式。它实际上与 Predicate 的使用完全无关。 this 的使用也不是实现方法链接的必要条件。

标签: java lambda java-8 java-stream fluent


【解决方案1】:

当您编写 t -&gt; t &gt; 4 时,Java 会自动推断此 lambda 的类型——它必须是 Predicate&lt;Integer&gt;,因为它正在通过 Stream&lt;Integer&gt; 传递给 filter——然后自动计算出必须是(Integer t) -&gt; t &gt; 4

【讨论】:

    猜你喜欢
    • 2014-09-12
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-01
    • 1970-01-01
    相关资源
    最近更新 更多