比较 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 定义了一堆方便的比较器构建方法,例如reversed
和thenComparing
。
【讨论】:
这可能是个 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 的函数类型的主要内容,如果未能解决你的问题,请参考以下文章
《Java8实战》 - 读书笔记 - Lambda 表达式的组合用法