我最近掌握了Java 8中引入的Lambda表达式。我发现,每当我使用功能接口时,我总是总是使用Lambda表达式,而不是创建实现该功能接口的类。
这被认为是好的做法吗?还是他们的情况不适合将Lambda用于功能接口?
我最近掌握了Java 8中引入的Lambda表达式。我发现,每当我使用功能接口时,我总是总是使用Lambda表达式,而不是创建实现该功能接口的类。
这被认为是好的做法吗?还是他们的情况不适合将Lambda用于功能接口?
Answers:
有许多条件应使您考虑不使用lambda:
priceIsOver100
。 x -> x.price > 100
和这个名字一样清楚。我的意思是这样的名字isEligibleVoter
代替了一长串条件。不要太过分。请记住,软件很容易更改。如有疑问,请以两种方式编写它,然后看哪个更容易阅读。
我支持Karl Bielefeldt的回答,但想提供一个简短的补充。
Karl Bielefeldt接受的答案是正确的。我可以再加上一个区别:
嵌套在类内方法内的lambda代码可以访问在该方法和类内找到的任何有效最终变量。
创建实现该功能接口的类不会使您直接访问调用代码的状态。
要引用Java教程(重点煤矿):
像本地和匿名类一样,lambda表达式可以捕获变量。它们对封闭范围的局部变量具有相同的访问权。但是,与本地和匿名类不同,lambda表达式没有任何阴影问题(有关更多信息,请参见阴影)。Lambda表达式具有词法范围。这意味着它们不会从超类型继承任何名称,也不会引入新的作用域级别。解释lambda表达式中的声明就像在封闭环境中一样。
因此,虽然提取长代码并命名有很多好处,但您必须权衡直接访问封闭方法和类的状态的简单性。
看到:
这可能是挑剔的,但是除了其他答案中提到的所有其他优点之外,我还要添加:
尽可能使用方法参考。相比:
employees.stream()
.map(Employee::getName)
.forEach(System.out::println);
与
employees.stream()
.map(employee -> employee.getName())
.forEach(employeeName -> System.out.println(employeeName));
使用方法引用可以省去命名lambda参数的麻烦,这通常是多余的,并且/或者导致诸如e
或的惰性名称x
。