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

Comparing Java's lambda expression with Swift's function type

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

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

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


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

闭包比lambda更强大:

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

    1
    2
    3
    4
    5
    6
    7
    func makeIncrementer(forIncrement amount: Int) -> () -> Int {
        var runningTotal = 0
        return () -> Int {
            runningTotal += amount
            return runningTotal
        }
    }
  • (次要)闭包支持速记参数名,例如

    1
    reversedNames = names.sorted(by: { $0 > $1 } )
  • (小)尾随封闭支架,例如

    1
    2
    3
    someFunctionThatTakesAClosure() {
        // trailing closure's body goes here
    }
  • 另一方面,功能接口比功能类型更强大。它们允许声明额外的方法,例如java.util.comparator,它定义了一系列用于构建比较程序的方便方法,例如reversedthenComparing


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

    为了在爪哇中编写lambda表达式,必须使用一种方法来实现接口。JDK中已经有一些接口为您设计了,但是imho,它们的名称没有swift的函数类型那么具有描述性。您不能立即猜测Predicate接受T参数并返回boolean。另一方面,T -> Bool更干净更清晰。

    我想,除此之外,Java的lambda表达式可以实现SWIFT函数类型所能做的任何事情。


    我认为,无论在什么情况下,你都必须学习,我作为Java开发人员,可以说功能编程是一个很难理解的主题,但我现在理解了很多特性,我不知道在使用闭包时是否可以在SWIFT中使用流,一旦你获得了函数接口,以及如何实现lambdas,你就会意识到你可以做一个LO。在lambda/streams组合中以更易读的方式使用几行代码的情况下,我认为Oracle在这方面付出了很大的努力,如果您使用得当,您可以生成更清晰、更好的代码,以回答您的问题,这两种代码都很强大,但我同意lambda更像swift的闭包。