关于Lambda表达式
以Arrays.sort(intervals, (a, b) - Integer.compare(a[0], b[0]));为例子Arrays.sort方法要求第二个参数是Comparatorint[]编译器通过(a, b)得知参数类型Comparatorint[]会去找这个接口然后下面只有一个抽象方法compare然后就重写这个方法重写的内容就是Integer.compare(a[0], b[0])1.Lambda 表达式的本质(a,b)-Integer.compare(a[0],b[0])这行代码的本质是一个匿名函数的简写形式2.一步步还原 Lambda原始需求Arrays.sort()需要第二个参数是Comparatorint[]类型的对象publicstaticTvoidsort(T[]a,Comparator?superTc)演化过程第1层最原始的方式 - 创建实现类classMyComparatorimplementsComparatorint[]{Overridepublicintcompare(int[]a,int[]b){returnInteger.compare(a[0],b[0]);}}Arrays.sort(intervals,newMyComparator());第2层匿名内部类Arrays.sort(intervals,newComparatorint[](){Overridepublicintcompare(int[]a,int[]b){returnInteger.compare(a[0],b[0]);}});第3层Lambda 表达式Arrays.sort(intervals,(a,b)-Integer.compare(a[0],b[0]));3.Lambda 的编译原理当你写 Lambda 时编译器会推导类型知道a和b是int[]类型因为intervals是int[][]生成方法创建一个与Comparatorint[].compare()签名匹配的方法创建实例在运行时创建该接口的实例反编译后近似于// 编译器生成的近似代码privatestaticintlambda$main$0(int[]a,int[]b){returnInteger.compare(a[0],b[0]);}// 然后创建 Comparator 实例Arrays.sort(intervals,newComparatorint[](){Overridepublicintcompare(int[]a,int[]b){returnlambda$main$0(a,b);}});4.Lambda 的语法解析(参数列表)-{方法体}(a,b)-Integer.compare(a[0],b[0])(a, b)参数列表类型自动推断-Lambda 运算符Integer.compare(a[0], b[0])方法体单行时可省略 {} 和 return
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2417134.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!