lambda语法_Java Lambda语法替代

lambda语法

关于lambda-dev邮件列表的讨论已经开始解决lambdas /函数文字的Java语言语法应该是什么样的问题。 让我们看一个稍微平凡的例子,然后尝试弄清楚问题。

Perl的人有一个很好的例子,说明以某种功能性的方式使用函数引用–他们称其为Schwartzian变换(但我相信它最初是Lisp的trick俩,有时也称为decorate-sort-undecorate)。 因为这里只有我们JVM鸡,所以我在Clojure中重写了它(实际上这是本书第9章中的示例之一)。

这是Clojure代码的片段,其中定义了执行Schwartzian转换的函数。 基本上,它提供了一种非常简单的方法,可基于调用者提供的辅助功能(称为“键控功能”)对列表进行排序。

(defn schwarz [x f]
  (map #(nth %1 0)
       (sort-by #(nth %1 1)
                (map #(let [w %1]
                     (list w (f w)) ) x))))

该代码执行三个单独的步骤-创建一个由对组成的列表(原始值与通过将键控函数应用于原始值而获得的值配对),然后根据键控函数的值对对进行排序。 最后,通过仅从排序对对列表中的每对中获取原始值(并丢弃键控函数值)来构建新列表。

在各种提议的Java语法变体中,这看起来像什么? 让我们快速看一下每一个(请注意,由于Java的类型系统更加静态,所以我们的许多类型声明都有些冗长):

// Strawman, with round brackets for single-expression lambdas
public List<T> schwarz(List<T> x, Function<T, Pair<T,V extends Comparable<T>>> f) {
return map(#(T w)(makelist(w, f.apply(w))), x)
       .sort(#(Pair<T, V extends Comparable<T>> l)(l.get(1)))
       .map(#(Pair<T, V extends Comparable<T>> l)(l.get(0)));
}

// Strawman, with braces for all lambdas
public List<T> schwarz(List<T> x, Function<T, Pair<T,V extends Comparable<T>>> f) {
return map(#(T w){makelist(w, f.apply(w))}, x)
       .sort(#(Pair<T, V extends Comparable<T>> l){l.get(1)})
       .map(#(Pair<T, V extends Comparable<T>> l){l.get(0)});
}

// BGGA
public List<T> schwarz(List<T> x, Function<T, Pair<T,V>> f) {
return map({T w -> makelist(w, f.apply(w))}, x)
       .sort({Pair<T, V extends Comparable<T>> l -> l.get(1)})
       .map({Pair<T, V extends Comparable<T>> l -> l.get(0)});
}

// SotL
public List<T> schwarz(List<T> x, Function<T, Pair<T,V>> f) {
return map(#{T w -> makelist(w, f.apply(w))}, x)
       .sort(#{Pair<T, V extends Comparable<T>> l -> l.get(1)})
       .map(#{Pair<T, V extends Comparable<T>> l -> l.get(0)});
}

// Redmond
public List<T> schwarz(List<T> x, Function<T, Pair<T,V extends Comparable<T>>> f) {
return map((T w) -> {makelist(w, f.apply(w))}, x)
       .sort((Pair<T,V extends Comparable<T>> l) -> {l.get(1)})
       .map((Pair<T, V extends Comparable<T>> l) -> {l.get(0)});
}

如何评估它们? 我的标准是:

  1. 需要以一个可见的识别标记开始,以便lambda可以从周围的代码中脱颖而出。 #是一个方便的字符。
  2. 需要使用{}分隔语法。 闭包是一种块,因此它们在代码中应类似于块。
  3. 需要全部集成在一起,因此语法具有视觉一致性,并且lambda显示为单个单元。
  4. 优选地,需要具有不带参数的函数文字的专用缩写形式(空lambda)。

基于这些标准,对我来说,雷德蒙德是最糟糕的选择-并且我为本书编写Scala的经验证明了这一点-我发现Scala的函数字面量比其他语言更难使用而没有问题。 BGGA稍好一些,但是我不喜欢缺少一个简单的识别标记来告诉我“你好! 我是lambda”。

这使它始终可以在SotL和Strawman之间进行选择。 这两个的选择有些随意。 在我看来,Strawman-always-brace看起来像是一个真正的Java方法声明,但是带有“魔术名称”#-而SotL是真正的新语法,但感觉更接近Redmond和BGGA样式-因此,这可能是一个可以接受的折衷方案对于熟悉这些表格的开发人员。

综合考虑,我的首选是:

  1. SotLhttp://www.blogger.com/img/blank.gif
  2. 稻草人总是大括号
  3. BGGA
  4. 斯特劳曼单表达轮
  5. 雷德蒙德

请使用注释(在下面或在原始来源处 )告诉我们您对这个问题的看法。 当然,这不会在Java 7中出现-但是现在开始考虑Java 8和未来还为时过早。

参考: Java 7开发人员博客上的 JCG合作伙伴提供的Lambda语法替代方案

相关文章 :

翻译自: https://www.javacodegeeks.com/2011/06/java-lambda-syntax-alternatives.html

lambda语法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值