将 Java 的 lambda 表达式与 Swift 的函数类型进行比较

2022-09-04 19:49:17

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

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

我的问题是,既然 Swift 的函数类型和 Java 的 lambda 表达式的目的是实现函数式编程,那么 Swift 的函数类型能做些什么,但 Java 的 lambda 表达式却做不到吗?还是它们都同样强大?


答案 1

比较Java的lambdas(实现)和Swift的功能类型(类型)是不正确的。但是可以将Java的lambda与Swifts的闭包进行比较。而 Swift 的功能类型到 Java 的功能接口

闭包比 lambda 更强大:

  1. (专业)闭包可以捕获非常变量,例如

    func makeIncrementer(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0
        return () -> Int {
            runningTotal += amount
            return runningTotal
        }
    }
    
  2. (次要)闭包支持速记参数名称,例如

    reversedNames = names.sorted(by: { $0 > $1 } )
    
  3. (次要)追踪闭仓支持,例如

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

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


答案 2

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

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

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