在Swift中,函数类型被视为一等公民,可以像任何其他类型一样在任何地方使用。它的语法很简单,易于理解和使用。
另一方面,Java确实支持通过lambda表达式进行函数编程,但总的来说,与Swift的函数类型相比,我发现它不那么直观,难以理解,而且看似更具限制性。
我的问题是,由于Swift的函数类型和Java的lambda表达式的目的是实现函数式编程,Swift的函数类型可以做什么,但Java的lambda表达式不能吗?或者他们都同样强大?
答案 0 :(得分:11)
比较Java的lambdas(实现)和Swift的functional type(类型)是不正确的。但是可以将Java的lambda与Swifts的Closures进行比较。而Swift的功能类型是Java的functional interfaces。
闭包比lambdas更强大:
(主要)闭包可以捕获非常数变量,例如:克
func makeIncrementer(forIncrement amount: Int) -> () -> Int {
var runningTotal = 0
return () -> Int {
runningTotal += amount
return runningTotal
}
}
(次要)Closures支持速记参数名称,例如
reversedNames = names.sorted(by: { $0 > $1 } )
(次要)尾随闭包支持,例如
someFunctionThatTakesAClosure() {
// trailing closure's body goes here
}
另一方面,功能接口比功能类型更强大。它们允许声明其他方法,例如java.util.Comparator为比较器构建定义了一系列方便的方法,例如reversed
和thenComparing
。
答案 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更像是快速的闭包。