0.why lambda?
简化代码,紧凑结构。
代码简洁程度:外部类->内部类->匿名内部类->lambda->方法引用
parameters –> a expression;
or (parameters)->{expressions ; }; 注意要有返回值。
参数可为空:以()表示。
1.lambda表达式在java8中的实现形式
Lambda表达式生成了一个内部类。
参考博文 https://www.cnblogs.com/WJ5888/p/4667086.html#
此博文在分析lambda表达式的时候,采用了①直接javap生成字节码文件的分析②反证法,通过自己创建了一个与从字节码文件反编译得到的方法同名的方法来反面证明自己的设想;
侧面证明了:lambda表达式会首先被编译为一个 私有的静态函数!
查看字节码文件之前就会,而博主根据反证法来验证自己的想法,此处学习了。
其后,该表达式会生成一个内部类。
core java volume中,将lambda表达式安排在紧挨着接口及内部类看来确有深意。
此处添加了 -Djdk.internal.lambda.dumpProxyClasses 指令,可以将生成的内部类字节码输出到一个文件中。
2.函数式接口的实现对象
该对象实现了将方法作为参数传递给方法或者返回一个方法的作用
故而,该接口应当有且仅有一个未实现的方法,以指明该实现对象将向何方法传递参数。
lambda表达式不能脱离函数式接口而独立存在。即函数式接口是Lambda表达式的目标类型。
3.方法引用
why 方法引用?
有时使用lambda表达式创建匿名方法时 仅仅时调用了已存在的方法。故可将lambda表达式简化为方法引用。
1.方法引用。
①Object:instanceMethod ②Class:staticMethod ③Class:instanceMethod
使用方法 参数::方法名 (该参数应匹配该方法的参数列表,且返回值也应匹配) -------------------------------->方法①②
若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: 类名::实例方法名 --------->方法③ 如下:
Arrays.sort(array,String::compareToIgnoreCase);
Arrays.sort(array,(a,b)->a.compareToIgnoreCase(b));
2.构造方法引用
①Class::new ②Class[]::new
import java.util.Arrays;import java.util.Comparator;import java.util.function.BiPredicate;import java.util.stream.Stream;/** * author:wanghuanyeah * 2019/10/26 * 8:37 */public class Test { public static void main(String[] args) {/* new Thread(new Runnable() { @Override public void run() { System.out.println("hello"); } }).start();*//* new Thread( ()-> System.out.println("hellowhh")).start();*/ String[] array={"aaaa","bbb","c","36"}; Integer[] is={5,88,66,11,9999};Comparator<Integer> comparator=(v1,v2)->Integer.compare(v1, v2); Arrays.sort(is,comparator); Stream.of(is).forEach(System.out::println);System.out.println("**************************************************"); Arrays.sort(array, (e1,e2)->Integer.compare(e1.length(), e2.length())); Stream.of(array).forEach(System.out::println);System.out.println("**************************************************"); Arrays.sort(array,String::compareToIgnoreCase); Arrays.sort(array,(a,b)->a.compareToIgnoreCase(b)); Stream.of(array).forEach(System.out::println);System.out.println("**************************************************"); BiPredicate<String,String> biPredicate=String::equals; System.out.println(biPredicate.test("wanghuan", "wanghuan")); }}