到目前为止,在Java中向其他代码传递一段代码并不是很容易。你不可能将代码块到处传递。由于java是一个面向对象的语言,因此你不得不构建一个属于某个类的对象,由它的某个方法来包含所需的代码。
lambda表达式帮我们解决了这个问题,可以直接传递代码块!Java中lambda表达式的格式:参数,箭头(->),以及一个表达式。示例:
(String first,String second) -> Integer.compare(first.length(), second.length())
如果负责计算的代码无法用一个表达式表示,那么可以用编写方法的方式来编写:即用{}包裹代码并明确使用return语句,例如:
(String first,String second) -> { if(first.length() < second.length()) return -1; else if(first.length() > second.length()) return 1; }
如果lambda表达式没有参数,你仍可以提供一对空的小括号,如同不含参数的方法那样:
() -> {for(int i=0; i<1000;i++) doWlrk();}
如果一个lambda表达式的参数类型是可以被推导的,那么就可以省略它们的类型,例如:
Comparator<String> comp = (first,second) -> Integer.compare(first.length(),second.length());
这里,编译器会推导出first和second必须是字符串,因为lambda表达式被赋给了一个字符串比较器。如果某个方法只含有一个参数,并且该参数的类型可以被推导出来,你甚至可以省略小括号:
EventHandler<ActionEvent> listener = event -> System.out.println("Thanks for clicking!");
注意:你可以像对待方法参数一样向lambda表达式的参数添加注解或者final修饰符,如下:
(final String name) -> .... (@NonNull String name) -> ...
永远不需要为一个lambda表达式执行返回类型,它总是会从上下文中被推导出来。例如,表达式:
(String first,String second) -> Integer.compare(first.length(),second.length())
可以被使用在期望结果类型为int的上下文中。
注意:在lambda表达式中,只在某些分支中返回值(其它分支没有返回值)是不合法的,示例:
//不合法 (int x) -> {if(x >= 0) return 1;}
时间: 2024-11-09 17:20:41