比较 Java 的 lambda 表达式和 Swift 的函数类型

Posted

技术标签:

【中文标题】比较 Java 的 lambda 表达式和 Swift 的函数类型【英文标题】:Comparing Java's lambda expression with Swift's function type 【发布时间】:2017-03-20 10:59:12 【问题描述】:

在 Swift 中,函数类型被视为一等公民,可以在任何地方使用,就像任何其他类型一样。它的语法简单明了,易于理解和使用。

另一方面,Java 确实支持通过 lambda 表达式进行函数编程,但总的来说,与 Swift 的函数类型相比,我发现它不太直观、更难理解,而且似乎更具限制性。

我的问题是,既然 Swift 的函数类型和 Java 的 lambda 表达式的目的都是为了实现函数式编程,那么有没有 Swift 的函数类型可以做的事情,而 Java 的 lambda 表达式却不能呢?还是它们都同样强大?

【问题讨论】:

考虑将Kotlin 添加到比较中。 应该考虑的是 Java 中的性能/膨胀问题:realm.io/news/360andev-jake-wharton-java-hidden-costs-android 基本上,Swift 的闭包和函数类型的实现是语言核心的一部分。 Java 的实现已经完成。 【参考方案1】:

比较 Java 的 lambdas(实现)和 Swift 的 functional type(类型)是不正确的。但是可以将 Java 的 lambda 与 Swifts 的 Closures 进行比较。而 Swift 的函数类型为 Java 的functional interfaces。

闭包比 lambda 更强大:

    (主要)闭包可以捕获非常量变量,例如。 g

    func makeIncrementer(forIncrement amount: Int) -> () -> Int 
        var runningTotal = 0
        return () -> Int 
            runningTotal += amount
            return runningTotal
        
    
    

    (次要)闭包支持简写参数名称,例如

    reversedNames = names.sorted(by:  $0 > $1  )
    

    (次要)尾随闭包支持,例如

    someFunctionThatTakesAClosure() 
        // trailing closure's body goes here
    
    

另一方面,函数式接口比函数式类型更强大。它们允许声明其他方法,例如java.util.Comparator 定义了一堆方便的比较器构建方法,例如reversedthenComparing

【讨论】:

这可能是个 hack,但您可以使用 Java 中的数组来表现您的情况 #1,即 final int[] runningValue = new int[] 0 ; 然后 () -> return ++runningValue[0]; 【参考方案2】:

我只能想到 Java 函数式 API 中的一个限制。

为了在 Java 中编写 lambda 表达式,您必须需要一个具有一种方法的接口。 JDK 中已经为您制作了一些接口,但恕我直言,它们的名称不如 swift 的函数类型具有描述性。您无法立即猜到Predicate<T> 接受T 参数并返回boolean。另一方面,T -> Bool 更干净更清晰。

我认为除此之外,Java 的 lambda 表达式可以做任何 swift 函数类型可以做的事情。

【讨论】:

【参考方案3】:

我想,无论如何你都要学,我作为java开发者,可以说函数式编程是一个很难理解的话题,但是我现在了解了很多特性,我不知道你是否可以使用使用闭包时 SWIFT 中的流,一旦您获得了功能接口以及如何实现 lambda,您将意识到您可以使用 lambda/streams 组合以更易读的方式用几行代码做很多事情,我认为 oracle已经为此付出了很多努力,如果你使用得当,你可以编写更清晰更好的代码,回答你的问题两者都很强大,但我同意 lambdas 更像是 swift 的闭包。

【讨论】:

以上是关于比较 Java 的 lambda 表达式和 Swift 的函数类型的主要内容,如果未能解决你的问题,请参考以下文章

Lambda表达式用法大比较: Scala和Java 8

《Java8实战》 - 读书笔记 - Lambda 表达式的组合用法

聊聊Java 8的Lambda表达式和函数式接口

Java的for循环、增强for循环、lambda表达式中的forEach 三种方式优缺点比较?

Java的Lambda表达式

Java函数式编程:Lambda表达式