Curmudgeon 认识Smalltalk的Dude

在修改Eclipse Java开发工具 (JDT)项目正在开发的Java 8支持时,我一直在使用这种语言。

我承认我对Java 8中的lambda有点不满意。 当然,这来自于知道Smalltalk (和LISP / Scheme)的老兄 。

像其他任何优秀的Smalltalk中奖记录一样,当我着手学习如何使用lambda时,我自然决定实现已知和喜爱的集合。

从这样的事情开始:

OrderedCollection employees = new OrderedCollection();
employees.add(new Employee("Wayne", 10));
employees.add(new Employee("Joel", 9));
employees.add(new Employee("Jon", 6));
employees.add(new Employee("Anthony", 8));
employees.add(new Employee("Mary", 2));
employees.add(new Employee("Sue", 3));
employees.add(new Employee("Joanne", 7));
employees.add(new Employee("Shridar", 1));

在经典Java中,您将执行以下操作来寻找具有五年以上经验的员工:

List longTerm = new ArrayList();
for(Employee employee : employees) if (employee.years > 5) longTerm.add(employee);

使用lambda,您可以执行以下操作:

OrderedCollection longTerm = employees.select(employee -> employee.years > 5);

它比经典Java更加严格,我个人认为它非常易读和易懂; 具有不同经验的读者可能有不同的选择。 我相信这比匿名类的等效实现要好得多:

OrderedCollection longTerm = employees.select(new SelectBlock() {@Overridepublic boolean value(Employee employee) {return employee.years > 5;}
});

匿名班使婴儿哭泣。

当然,婴儿也不会对select()的实现特别满意:

public class OrderedCollection<T> extends ArrayList<T> {...public OrderedCollection<T> select(SelectBlock<T> block) {OrderedCollection<T> select = new OrderedCollection<T>();for(T value : this) {if (block.value(value)) select.add(value);}return select;}...
}

Lambda是匿名类的语法糖 ,可以说使某些代码更易于阅读。 对于我的简单化示例,从可读性的角度来看,直接使用for -loop的好处是微不足道的,但比匿名类示例更容易理解。 从性能的角度来看,我希望在这种情况下使用lambda或匿名类比仅使用for -loop差一个数量级。

我们在Smalltalk中做的比较酷的事情之一就是创建自己的控制结构。 您可以创建自定义的迭代器,而不是创建一个全新的集合,例如:

payroll.longTermEmployeesDo(employee -> payroll.giveEmployeeARaise(employee));

或类似的东西。 我不确定这是否会更好。

简单集合可能不是lambda的最佳用法。 Lambda并不像Smalltalk中的代码块那么有用(或者,我相信它有效率)。 我需要花更多时间修改一些示例,这些示例中Java中使用匿名类更为自然( Runnable和侦听器似乎是一个显而易见的起点)。

不幸的是,我认为尝试使用Java 8中的lambda实现类似于Smalltalk的集合也会使婴儿哭泣。

作为分手,请尝试绕开您的大脑:

double average = (double)employees.inject(0, (sum, employee) -> sum + employee.years) / employees.size();

完全可读。 完全。

于2014年2月18日修改。 最初的观察使我相信lambda是匿名类的语法糖。 从那以后,我得知情况并非如此。 此外,我需要更好地理解一些优化。 我删除了不正确的陈述(但为了后代而留了它)。

参考: Eclipse提示,技巧和Random Musings博客上的JCG合作伙伴 Wayne Beaton在JDT中使用Java 8 Lambdas玩游戏 。

翻译自: https://www.javacodegeeks.com/2014/02/playing-with-java-8-lambdas-in-the-jdt.html

在JDT中使用Java 8 Lambda相关推荐

  1. java jdt_在JDT中使用Java 8 Lambda

    java jdt 旧 Curmudgeon 认识Smalltalk的Dude 在修改Eclipse Java开发工具 (JDT)项目正在开发的Java 8支持时,我一直在使用这种语言. 我承认我对Ja ...

  2. 一行中的Java 8 Lambda

    如果您了解这一行,或者更好的是仍然可以编写此代码,则可以说您已经了解了Java 8 Lambda的本质. 当然,它们可以与集合一起使用. 我在Peter Lawrey最近的一次演讲中发现了这一点 . ...

  3. lambda表达式_在Java 7或更早版本中使用Java 8 Lambda表达式

    lambda表达式 我认为没有人会拒绝Java 8引入的Lambda表达式的有用性.但是,许多项目都停留在Java 7甚至旧版本上. 升级可能既耗时又昂贵. 如果第三方组件与Java 8不兼容,则可能 ...

  4. 在Java 7或更早版本中使用Java 8 Lambda表达式

    我认为没有人会拒绝Java 8引入的Lambda表达式的有用性.但是,许多项目都停留在Java 7甚至旧版本上. 升级可能既耗时又昂贵. 如果第三方组件与Java 8不兼容,则可能根本无法升级. 除此 ...

  5. java 8 lambda表达式中的异常处理

    文章目录 简介 处理Unchecked Exception 处理checked Exception 总结 java 8 lambda表达式中的异常处理 简介 java 8中引入了lambda表达式,l ...

  6. java lambda::_书评:精通Lambda:多核世界中的Java编程

    java lambda:: 从版本8开始,λ编程(lambda编程)终于在Java世界中引入.此功能将在很大程度上改变Java开发人员的编程方式以及针对样板代码的新"武器". Ja ...

  7. 书评:精通Lambda:多核世界中的Java编程

    从版本8开始,λ编程(lambda编程)终于在Java世界中引入.此功能将在很大程度上改变Java开发人员的编程方式以及针对样板代码的新"武器". Java 8通过引入新的Stre ...

  8. JAVA 8 lambda 表达式实现按某个属性值查找对象集合中符合条件的对象

    转载自:https://www.cnblogs.com/lindsayYang/p/9843599.html JAVA 8 lambda 表达式实现按某个属性值查找对象集合中符合条件的对象 当前的需求 ...

  9. 10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...

最新文章

  1. PE文件和COFF文件格式分析——导出表
  2. 报错解决:undefined reference to `snappy::MaxCompressedLength(unsigned long)'
  3. poj1985 Cow Marathon(树的直径#入门)
  4. Android中Application类用法
  5. java中如何数组是如何赋值的?
  6. 第一次作业源于计科一班的王相博
  7. 别再用 Redis List 实现消息队列了,Stream 专为队列而生
  8. 我就是互联网的老不死
  9. 神经网络在游戏中的应用,神经网络控制应用实例
  10. 指数函数用计算机怎么计算器,万能计算器怎么使用 使用科学计算器方法
  11. 微信小程序锦鲤砍价 搭建教程完整版
  12. 老男孩python作业题_老男孩python学习第一天作业
  13. 在面试中脱颖而出的流程全解
  14. lol人物模型提取(三)
  15. [操作系统]进程管理 进程同步、死锁相关、处理机调度
  16. word文档除号怎么打出来之除号插入的方法教程
  17. Java初学者都必须理解的六大问题
  18. Flask 源码解析:session
  19. 多线程之互斥锁(mutex)的使用方法
  20. 【Rust 日报】2022-10-16 全栈同构Web框架leptos

热门文章

  1. 2015c语言9月答案,2015年9月计算机二级C语言预测题答案
  2. python3多线程第三方库_Python3 多线程
  3. (转)HttpURLConnection与 HttpClient 区别
  4. java泛型程序设计——翻译泛型表达式+翻译泛型方法
  5. 省编码市编码区县编码_无浪费编码
  6. java.线程池 线程数_如何在线程“ main”中修复异常java.lang.NoClassDefFoundError:Java中的org / slf4j / LoggerFactory...
  7. java性能监视_Java 9和应用程序性能监视的激动人心之处
  8. log4j2 xsd_Log4j 2.x XSD的描述不完整
  9. jasmine单元测试_使用Jasmine,Spock和Nashorn测试JVM服务器端JavaScript
  10. 在Java 8之前的项目中使用JUnit 5