lambda表达式时一个可传递的代码块,可以在以后执行一次或多次。
lambda表达式的语法:
(传入参数,传入参数......)->一个表达式或者一段代码块
例如:
(String first,String second)->first.length()-second.length(); (String first,String second)->{ if(first.length()<second.length())return -1; else if(first.length()>second.length())return 1; else return 0; }
有两个需要注意的地方。一是如果是代码块的话必须有显性的return语句。其次,可以没有参数,就像无参方法一样。
lambda表达式可以嵌入需要它的地方,就像作为参数放在方法中(前提是该方法需要的参数于lambda表达式的返回值一致。)
再者,如果可以推导lambda表达式的类型,就可以忽略他的类型。
例如:
Comparator<String> comp=(first, second)->first.length()-second.length(); //省略了(String first,String second)中的类型
其中Comparable接口的源码:
public interface Comparator<T> { int compare(T o1, T o2);//这里只展示了compare方法 }
这段代码的意思就是创建了一个Comparable<String>类型的对象,它的compareTo方法就是lambda表达式的内容。通过Comparable接口的泛型确定了compareTo方法传入参数的类型,也就是lambda表达式传入的类型是String,就可以省略String 类型了。
(泛型也是个需要复习的点,说不定以后我还会写一篇文章介绍/复习一下)
好了,这就学完了lambda表达式,接下来只要会应用就行了。
———————————————————————————————————————————
lambda表达式的变量作用域
lambda表达式可以捕获外围作用域中的变量的值,并且只能引用而不会改变变量的值。
———————————————————————————————————————————
函数式接口应该是lambda表达式很重要的应用了。
对于只有一个抽象方法的接口,需要这种接口的对象时,就可以提供一个lambda表达式。这种接口称为函数式接口。
例子:快拉上去看那个Comparator接口。没错,Comparator就是一个函数式接口。
有一种Arrays.sort()方法,它的第二个参数需要一个Comparator实例,这个Comparator就可以提供一个lambda表达式实现。即:
Arrays.sort(words,(first,second)->first.length()-second.length());
原本的写法是:
Comparator<String> comp=(first, second)->first.length()-second.length();
Arrays.sort(words,comp);
除了函数式接口,lambda表达式还能用在方法引用、构造器引用中。
———————————————————————————————————————————
笔者文字功底有限,这里引用《JAVA核心技术》书中的原话。第一次写文章还挺累的...欢迎大家讨论留言,受水平约束,有不对的地方欢迎指出!