今天刚自学了lambda表达式的运用,简单用白话写个总结。
适用于有java基础的人学习参考。
首先什么是Lambda表达式?
就是一种表达式的写法,作用就是通过传参的方式传递代码块,去实现抽象方法。
格式:(参数) -> {代码块}
什么时候需要传递代码?
抽象方法这个概念有基础的应该都知道,它在定义的时候是不需要方法体的。常规操作都是通过继承抽象类或者实现接口的方式去实现抽象方法。而lambda表达式的作用就是我们不需要使用一个新类去继承实现,而仅通过表达式就可以实现抽象方法。可以理解为匿名内部类的一种新的写法。区别是,lambda表达式是依托于函数接口存在的。
什么是函数接口?
我们定义一个接口,并且该接口中有且仅有一个抽象方法,这个接口就是函数接口。
为什么lambda表达式要依托于函数接口?
因为lambda表达式会默认去找对应接口的唯一方法,如果不是函数接口,接口里面有多个方法,表达式不知道应该去找哪个,会报错。
怎么使用?
举个例子:
首先我们创建一个函数接口,这里举例有String类型返回值,但是没有参数的函数接口。
传统操作,如果我们要使用这个接口,需要去写实现类实现这个接口,重写get方法,然后在使用的时候,去创建一个这个接口的子类对象,通过对象调用方法,但是有了lambda表达式就方便了很多,如下:
实现:
结果:
这段代码就相当于,我们重写了接口中的get方法,内容是 return "test";
因为当前我定义的函数接口中没有参数,但是有返回值,而且在实现方法的时候只有一行表达式代码,可以省略return,所以可以简写成 () -> "test"。
再举一个有参数有返回值的例子(我这里就写的齐全一点,方便大家参考,我特意写成两行实现代码,两行需要使用{}括起来):
函数接口:
实现:
结果:
再举一个开发中可能会用到的例子,比如我们给集合进行排序,传统操作是调用sort方法,参数中使用Comparator
匿名内部类,然后在内部类中定义排序规则进行排序。而恰巧Comparator就是一个函数接口,我们可以直接通过lambda表达式对其中的compare方法进行实现。上代码:
传统写法:
lambda表达式写法:
输出结果:
是不是很简单,以上是我们自己定义了一个函数接口,然后又自己去通过lambda实现方法 。其实java8为了方便我们操作,给我们内置了常用的函数接口,需要的可以自行百度。