在修改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是匿名类的语法糖。 从那以后,我得知情况并非如此。 此外,我需要更好地理解一些优化。 我删除了不正确的陈述(但为了后代而留了它)。
翻译自: https://www.javacodegeeks.com/2014/02/playing-with-java-8-lambdas-in-the-jdt.html