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语法替代方案 。

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

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

lambda语法

lambda语法_Java Lambda语法替代相关推荐

  1. java lambda示例_Java Lambda 常用语法示例

    users.stream().forEach( item -> System.out.println(item.getId()) ); Optional optional = users.str ...

  2. java 语法_Java基础语法

    标识符 定义 给包,类,方法,变量起名字的符号. 组成规则 标识符由字母.数字.下划线.美元符号组成. 命名原则:见名知意 包名:全部小写,多级包用.隔开. 举例:com.jourwon 类.接口:一 ...

  3. java lambda 局部变量_java Lambda表达式访问局部变量详细介绍

    此前给大家带来了java Lambda表达式访问成员变量详细介绍,下面就要继续给大家介绍java Lambda表达式访问局部变量的内容,一起通过简单的文章来进行了解吧. 对于成员变量的访问Lambda ...

  4. java lambda例子_Java lambda 表达式常用示例

    实体类 package com.lkb.java_lambda.dto; import lombok.Data; /** * @program: java_lambda * @description: ...

  5. java 多线程语法_Java基础语法之多线程学习笔记整理

    众所周知,利用好多线程机制,可以大大提高系统整体的并发能力以及性能,而且线程间的切换和调度的成本小.因此,多线程是Java学习者必须掌握的语法重点.本文为大家整理了进程和线程.实现多线程方式.设置和获 ...

  6. java方法语法_Java基础语法----方法

    1.1 方法概述 在java中,方法就是用来完成解决某件事情或实现某个功能的办法.方法实现的过程中,会包含很多条语句用于完成某些有意义的功能--通常是处理文本,控制输入或计算数值.我们可以通过在程序代 ...

  7. java lambda 累加_Java lambda 循环累加求和代码

    Java lambda 循环累加求和代码,给大家,希望能,可以使用,这篇,小编 Java lambda 循环累加求和代码 易采站长站,站长之家为您整理了Java lambda 循环累加求和代码的相关内 ...

  8. java数组语法_Java 基本语法----数组

    数组 数组概述 数组是多个相同类型数据的组合,实现对这些数据的统一管理. 数组属引用类型,数组型数据是对象(Object),数组中的每个元素相当于该对象的成员变量. 数组中的元素可以是任何数据类型,包 ...

  9. java自学语法_java 基础语法学习

    注释 单行注释 多行注释 文档注释 public class HelloWorld { public static void main(String[] args) { //单行注释 //输出一个He ...

最新文章

  1. 为什么「反向传播」一定要在生物学上有对应?
  2. Python中的数据结构
  3. 前阿里程序员吐槽女友败家:开酒店必须400元起步,工资只有自己的1/3
  4. html 图片自动切换插件,jquery图片切换插件
  5. 中国液化石油气(LPG)市场销售现状与竞争发展策略分析报告2022-2028年版
  6. C#求空间两点之间的距离
  7. 牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】
  8. C++ STL string的构造函数
  9. 测试记录流水s1 0080481T02
  10. 水平布局的HTML表单
  11. 69. (待补) (使用sqlite3)实现简单的管理系统 MVC 将链表作为内存数据模型,将sqlite3作为数据库,将终端作为交互界面。读数据库生成 链表,修改链表写入文件。...
  12. 红旗Linux 网卡bond,Linux双网卡绑定一个IP的实现
  13. cad打开a3样板图形_CAD中怎样设置A3图纸模板
  14. cydia 未能连接服务器,cydia闪退解决办法_cydia无法连接网络问题怎么解决
  15. 入门Python,胶水语言的优势和困扰
  16. 做了多年开发的你发现自己的水平一直上不去,一篇文章教你如何提高开发水平的方法
  17. 第三方服务接入云平台的统一方案
  18. c语言去尾法和进一法的例子,进一法或去尾法在生活中的应用教学案例.doc
  19. mysql关于xsd数据集的论述
  20. 前端基础教程:简单的实现html+css+javascript点赞效果

热门文章

  1. Hibernate中使用Criteria查询及注解——(Emp.java)
  2. 马踏棋盘算法(骑士周游)+贪心优化
  3. redis存opc_KEPServerEX6完整免费版
  4. win10关闭快速启动_装系统不求人,快速制作启动U盘,傻瓜式重装WIN10
  5. java集合——映射表+专用集合映射表类
  6. 单列集合Set的实现类TreeSet
  7. camel apache_如何使用Apache Camel,Quarkus和GraalVM快速运行100个骆驼
  8. selenium编写脚本_Selenium脚本编写技巧和窍门
  9. 骆驼(camel)命名法_Apache Camel 3 –骆驼核心vs骆驼核心引擎(较小的核心)
  10. 混合多云架构_使用混合多云每个人都应避免的3个陷阱(第3部分)