java jdt_在JDT中使用Java 8 Lambda

java jdt

知道小话的老Curmudgeon花花公子

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() {
	@Override
	public 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循环的好处是微不足道的,但比匿名类示例容易理解。 从性能的角度来看,我希望在这种情况下使用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是匿名类的语法糖。 从那以后,我得知事实并非如此。 此外,我需要更好地理解一些优化。 我已经删除了不正确的陈述(但是为了后代而将其保留)。


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

java jdt

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值