- lamdba 表达式
主要是简化代码量,将代码执行过程量代码过长的部分进行处理简化(个人理解)
官方定义:
lambda表达式是一种匿名函数,lamdba允许函数作为一个方法的参数(函数作为方法参数传递),将代码象数据一样传递,目的是简化代码编写.
函数式接口
个人理解: 就是一个接口,里面只有一个抽象方法
官方定义: …..没找了
jdk8 提供了一个注解, 校验编译时是否符合语法
注解名: @FunctionalInterface
示例
传统新建一个线程并启动的代码如下:Runnable runnable = new Runnable() { @Override public void run() { System.out.println("running..."); } }; new Thread(runnable).start(); /** 上述是我们jdk8以前常用的新建线程的方式,需要实例化一个runnable 对象 将runnable 对象传入实例化的Thread中,调用start方法 */ /** 在jdk8 后, 此种类似的方式可简化为一下公式 函数式对象 变量名 = (参数1,参数2....) -> { 方法体 }; 例如下面的线程创建,可以写为如下方式: */ //简化1 Runnable r2 = ()->System.out.println("简化方式1"); new Thread(r2).start(); /** 上述例子中,因为new Runnable() 中没有参数传入,所以在简化时我们也不传入参数,方法体中 展示我们需要执行的业务,逻辑代码即可,上述简化1还可以简化为如下方式: */ //简化2 new Thread(()->System.out.println("简化方式2")).start(); /** 在简化1 中可以看到,我们使用进程启用时,最终使用的时thread 对象方式,Thread 对象中也需要一个实例对象传入,所以也可以看作一个内部匿名方法进行调用*/
上述示例及过程可以看到,简化方式可以减少代码量的开发,以前要写很多行的代码,现在只需要整理为一行就可 以实现以前多行的代码的效果
上述示例只是表述的无参情况下的应用,那么有参呢,请参考如下代码:
/** 接下来我新建一个比较器,用来处理list或者arrays 的排序,分组*/
Comparator<String> comparator = new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length()-o2.length();
}
};
TreeSet<String> treeSet = new TreeSet<>(comparator);
/** 传统方式 下同示例1中的写法,需要将comparator 实现内部类方法,然后将实例化的comparator传入TreeSet 中进行 处理后续业务,其中需要用到两个参数o1,o2 简化后代码如下:*/
//示例1
Comparator<String> c2 = (o1,o2)->o1.length()-o2.length();
TreeSet<String> treeSet1 = new TreeSet<>(c2);
/** 简化后可以看到,只需要在()中带入o1,o2 即可, 且不需要关心参数的类型,此处我觉得时因为类似于反射(反射也不太懂),将传入的参数与Comparator<String> 的内部接口进行映射对照,所以可以找到执行的时compare的方法
示例1 还可以简化为如下代码:
*/
//示例2
TreeSet<String> treeSet2 = new TreeSet<>((o1,o2)->o1.length()-o2.length());
/** 因为new TreeSet中需要传入一个Comparator的实例对象,所以可以等量代换为示例2 的写法*/
注意事项
lambda 使用了新的操作符号->
本文作者:• curtain •
版权声明:本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!