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

Perl的人有一个很好的例子,说明以某种功能性的方式使用函数引用–他们称其为Schwartzian变换(但我相信它最初是Lisp的一种技巧,有时也称为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语法替代方案 。

相关文章 :
  • 适用于Mac OS X的官方Java 7 –状态
  • 速览Java 7 MethodHandle及其用法
  • 了解和扩展Java ClassLoader
  • Java内存模型–快速概述和注意事项

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

Java Lambda语法替代相关推荐

  1. lambda语法_Java Lambda语法替代

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

  2. 【Kotlin】Kotlin 中使用 Lambda 表达式替代对象表达式原理分析 ( 尾随 Lambda - Trailing Lambda 语法 | 接口对象表达式 = 接口#函数类型对象 )

    文章目录 一.尾随 Lambda - Trailing Lambda 语法 二.Kotlin 中使用 Lambda 表达式替代对象表达式原理 1.Lambda 替换对象表达式 2.原理分析 3.示例分 ...

  3. Java Lambda表达

    Java 8 lambda表达式示例 我个人对Java 8发布非常激动,尤其是lambda表达式和流API.越来越多的了解它们,我能写出更干净的代码.虽然一开始并不是这样.第一次看到用lambda表达 ...

  4. Lambda表达式的生动理解以及Java Lambda表达式常见使用场景

    本篇承接上一篇 Java Lambda 表达式快速学习 , 对Lambda 表达式的语法格式进行演化说明, 并对Java 中Lambda表达式的常见使用场景进行说明. Lambda 表达式怎么来的? ...

  5. 打怪升级之小白的大数据之旅(一)<Java基础语法之Java的身世之谜>

    打怪升级之小白的大数据之旅(一) Java基础语法之Java的身世之谜 打怪升级之小白的大数据之旅(一) 前言 一.学习大数据之前 二.Java基础 what? why? how? 总结 前言 做了几 ...

  6. java while语句打印三角形_Ruby 和 Java 基础语法比较

    前言 这篇文章示例代码比较多, Java 程序员可以看到一些 Ruby 相关语法和使用,Ruby 程序员可以看看 Java 的基本语法和使用方法,本文比较长,将近万字左右,预计需要十几分钟,如果有耐心 ...

  7. 深入理解Java Lambda表达式,匿名函数,闭包

    前言 对于Lambda表达式一直是知其然不知其所以然,为了搞清楚什么是Lambda表达式,以及Lambda表达式的用法和作用,本文应运而生当做学习笔记分享出来,欢迎指正交流. 什么是Lambda 让我 ...

  8. Java基础知识第二讲:Java开发手册/JVM/集合框架/异常体系/Java反射/语法知识/Java IO

    Java基础知识第二讲(Java编程规范/JVM/集合框架/异常体系/Java反射/语法知识/Java IO/码出高效) 分享在java学习及工作中,常使用的一些基础知识,本文从JVM出发,讲解了JV ...

  9. Java Lambda表达式入门 1

    转载请标明出处:http://blog.csdn.net/xx326664162/article/details/53930569 文章出自:薛瑄博客 我对Java 8发布非常激动,尤其是lambda ...

最新文章

  1. IE8 的兼容性问题总结
  2. 清理系统垃圾文件的常用脚本
  3. C++ 基本的输入输出
  4. 实现lua面向对象的private属性
  5. 帧同步_微信小游戏接入“熊孩子噩梦”健康系统 帧同步能力上线
  6. 二 SVN代码冲突的解决
  7. 从3000米高空,一跃而下…
  8. Android笔记 使用Json从数据库读取数据+demo
  9. oracle-审计3
  10. 20191113每日一句
  11. 谷歌android q 安装,谷歌修复了Pixel智能机安装Android Q Beta 4后循环重启的bug
  12. java开发mac pro_苹果三款神秘 Mac 现身 macOS Big Sur 11.0.1 beta
  13. 转专业 计算机,转专业系列之信息/计算机
  14. c语言flag跳出循环,四种方法跳出多层循环(return goto flag try)
  15. ubuntu服务器网站备份,备份云服务器ubuntu系统
  16. Alpha版本冲刺(五)
  17. Python机器学习-数据预处理(二)
  18. ROS入门之Publisher的创建
  19. 如何从缓存白嫖网易云音乐
  20. 计算机系统结构课后习题答案

热门文章

  1. sqlserver安装教程
  2. Spring Boot和Apache Camel
  3. gradle maven_将工件从Gradle自动提升到Maven Central
  4. spring和spring_Spring WebApplicationInitializer和ApplicationContextInitializer的混淆
  5. akka的介绍_Akka笔记–演员介绍
  6. hibernate数据类型_Hibernate类型初学者指南
  7. 应用新的JDK 11字符串方法
  8. 用于在Synology NAS上测试Spring Boot Web应用程序的JUnit模拟文件
  9. dozer bean_使用Dozer框架进行Bean操作
  10. 使用Spring Boot和React进行Bootiful开发