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

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

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

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

【问题讨论】:

标签: java swift function lambda


【解决方案1】:

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

闭包比 lambda 更强大:

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

    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

【讨论】:

  • 这可能是个 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 的闭包。

    【讨论】:

      猜你喜欢
      • 2015-04-15
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多