java8之lambda表达式(lambda表达式语法)

到目前为止,在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;}


你可能感兴趣的:(java8之lambda表达式(lambda表达式语法))