λ表达式是什么呢?
java是面向对象的语言。什么都是对象,对象是类的实例(通过类new出来的)。这样做的好处就是用面向对象的思想来写代码。
但是,大家写程序的时候,往往是写一个方法然后去执行这个方,面向对象的处理的步骤就显得繁锁。步骤如下:
1.定义一个类。2在类里写对应的方法。3.调用这个类的方法(如果是静态方法,直接 类名.method;如果非静态方法,还需要new一个对象)
上面三个步骤是针对类里面的方法来说的。如果是接口里面的方法。本来接口是不能new的。但是java为了简化上面的步骤,new 接口,就相当于创建了一个匿名类。因此可以省略步骤1.
举几个例子如下:
-
1.线程的创建。Thread 的构造方法中需要传入一个Runnable接口。
利用接口创建Thread,代码如下:
Thread thread = new Thread(new Runnable() { @Override public void run() { while(true){ System.out.println("线程在运行中"); } } }); thread.start();
利用λ表达式创建Thread,代码如下:
Thread thread = new Thread(()->{while(true){ System.out.println("线程在运行中"); }}); thread.start();
-
2.集合类排序
利用接口排序代码如下:
List<Integer> list = Arrays.asList(34,23,5,67,43); list.sort(new Comparator<Integer>() { @Override public int compare(Integer o1, Integer o2) { return o1-o2; } });
利用λ表达式简化,代码如下:
List<Integer> list = Arrays.asList(34,23,5,67,43); list.sort((o1, o2) -> o1-o2);
通过上面两个例子,可以发现。java中方法的入参可以是一个接口。比如list.sort方法,入参就是Comparator接口。有兴趣的同学可以跟踪jdk源码发现,list的排序,主要是利用了Comparator接口的compare方法。由于java是面向对象的语言,他的方法的入参只能是一个对象而不能是一个方法。但是编程需要入参是方法。那么这个问题是怎么解决的呢?由于java的方法的定义最简洁的方式是定义在接口中,因此当java中某个方法需要传入方法时,可以new一个接口,new一个接口相当于一个匿名类的对象。
-
3.自定义方法,方法的入参含有接口,并利用该接口中的方法
方法说明如下:定义一个方法compareTwoStr,方法有三个入参 。分别如下 String str1,String str2, BiFunction bi 。方法返回的值通过BiFunction 的apply方法比较。代码如下:
public static boolean compareTwoStr(String str1, String str2, BiFunction<String,String,Boolean> biFunction){ return biFunction.apply(str1,str2); } public static void main(String[] args) { //判断字符串是否相等 boolean isEqual = compareTwoStr("s1","s1",(s1,s2)->s1.equals(s2)); //判断字符串长度是否相等 boolean lengthEquals = compareTwoStr("s12332","s1ss",(s1,s2)->s1.length() == s2.length()); System.out.println(isEqual); System.out.println(lengthEquals); }
看到没有,BiFunction接口实际上只有一个作用,提供apply方法。具体方法的逻辑是什么,可以通过λ表达式来实现。