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

时间:2016-11-07 06:58:49

标签: java swift function lambda

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

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

我的问题是,由于Swift的函数类型和Java的lambda表达式的目的是实现函数式编程,Swift的函数类型可以做什么,但Java的lambda表达式不能吗?或者他们都同样强大?

3 个答案:

答案 0 :(得分:11)

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

闭包比lambdas更强大:

  1. (主要)闭包可以捕获非常数变量,例如:克

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

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

    someFunctionThatTakesAClosure() {
        // trailing closure's body goes here
    }
    
  4. 另一方面,功能接口比功能类型更强大。它们允许声明其他方法,例如java.util.Comparator为比较器构建定义了一系列方便的方法,例如reversedthenComparing

答案 1 :(得分:2)

我只能想到Java功能API中的一个限制。

为了在Java中编写lambda表达式,您必须使用具有一个方法的接口。在JDK中已经为您创建了一些接口,但是恕我直言,它们的名称不像swift的函数类型那样具有描述性。您无法立即猜出Predicate<T>接受T参数并返回boolean。另一方面,T -> Bool更清晰,更清晰。

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

答案 2 :(得分:0)

我认为,你无论如何都要学习,我作为java开发人员,可以说功能性编程是一个难以理解的主题,但我现在了解了很多功能,我不知道你是否可以使用使用闭包时SWIFT中的流,一旦你获得了功能接口以及如何实现lambdas,你会发现你可以通过lambda / streams组合以更易读的方式用几行代码做很多事情,我想oracle我已经付出了很多努力,如果你使用得好,你可以制作更干净,更好的代码,回答你的问题都很强大,但我同意lambdas更像是快速的闭包。