Pra*_*aki 19 java lambda java-8
Interface AccountService{
public void createAccount();
}
AccountService accountServiceAnonymous = new AccountService(){
public void createAccount(){
Account account = new Account();
save(account);
}
};
AccountService accountServiceLambda = () -> {
Account account = new Account();
save(account);
}
Run Code Online (Sandbox Code Playgroud)
除了减少代码行数之外,在java 8中使用lambda表达式还有什么其他优点吗?
sha*_*zin 20
添加@Bilbo在评论中提到的内容.在Java 1.7中,发布了一个名为invokedynamic
Java 8 Lambda 的新JVM操作码.因此,以下代码将导致在编译代码时创建Anonymous类.可能<ClassName>$1.class
如此,如果你有10个匿名类,那么在最后一个jar中还有10个类.
AccountService accountServiceAnonymous = new AccountService(){
public void createAccount(){
Account account = new Account();
save(account);
}
};
Run Code Online (Sandbox Code Playgroud)
但是Java 8 lambda invokedynamic
用来调用lambdas,因此如果你有10个lambdas,它将不会导致任何匿名类,从而减少最终的jar大小.
AccountService accountServiceLambda = () -> {
Account account = new Account();
save(account);
}
Run Code Online (Sandbox Code Playgroud)
当您将它们与Stream API和Java 8中添加的其他功能(例如Optional)结合使用时,lambdas(和方法引用)的另一个优点是可见的.
考虑以下代码:
private void pushToFront(AbstractInfo contactInfo) {
registeredWindows.stream()
.filter(window -> window.getWindowId() == contactInfo.getId())
.findAny()
.ifPresent(Window::pushToFront);
}
Run Code Online (Sandbox Code Playgroud)
该方法过滤与windowId匹配的已注册窗口列表,其中联系人的id返回Optional.如果列表包含具有匹配id的窗口,则可以使用Optional中的值,然后使用pushToFront方法.将其与相同的功能进行比较,但是用Java 7编写:
private void pushToFront(AbstractInfo contactInfo) {
for (Window window : registeredWindows) {
if (window.getWindowId() == contactInfo.getId() {
window.pushToFront();
}
}
}
Run Code Online (Sandbox Code Playgroud)
至少对我来说,带有lambda表达式,流和方法引用的代码更简洁和可读(当你习惯使用流时).上面的例子非常简单 - 但考虑一个,在Java 7中需要嵌套循环,多个条件语句等.不容易阅读甚至更难以忽略正在发生的事情.
Lambda然后允许人们充分利用Java 8的其他整洁功能,其中包括整洁,干净,高效且易于理解的代码.
最重要的是,您应该将lambda表达式视为更大整体的一部分,这对于他们自己来说很好,但与Java 8的其他"构建块"结合使用时更好.
小智 6
lambda 表达式的优点