JDK8新特性之Lambda表达式和四大函数接口
在Java8中,加入了Lambda(Lambda expression),在使用它以前我们先聊聊为什么要加入Lamdba,使用它对于编程上有什么好处
一、Lamdba的作用
1.在我们需要把一些功能传递给某些方法时,在 Java 8 以前,我们就需要去写匿名内部类。引入lambda表达式后,你可以在一个类中简便的定义参数和方法,替代大部分匿名内部类和功能接口,使得代码更加优雅,Lambda提供了一个参数列表和只用这些参数的功能体,也被称为闭包。
二、使用Lambda表达式要知道的规范
1.一个Lambda必须对应一个接口,并且这个接口是有要求的,这个接口只能被实现一个方法,如果写了多个方法,在写Lambda表达式的时候就会报不是只有一个抽象方法在接口内。无法使用lambda进行编码。
2.如何让程序知道接口是函数型的呢,需要在接口上添加@Functionallnterface注解。
三、Lambda表达式格式
1.语法形式为 () -> {},其中()为参数列表,{}为方法体,->是一个Lambda表达式,可以理解为一个箭头,为{}方法体中的方法提供参数。
首先创建两个接口
@FunctionalInterface public interface LambdaNoreture2 { void method(string a,string b); } @FunctionalInterface public interface LambdaNoreture1 { void method(string a); }
Lambda表达式基本格式(参数a,参数b)->{方法体}
public class Lambda { public static void main(String[] args) { LambdaNoreture2 lambdaNoreture2=(String a,String b)->{ System.out.println("Hello" + a + b +"!"); }; lambdaNoreture2.method("Lam","bda"); } //输出HelloLambda!
Lambda简写方式:如果参数和方法都只有一个那么可以省略掉圆括号()和大括号{};如果多个或一个参数类型一样,可以不写参数类型,如下。
public class Lambda { public static void main(String[] args) { LambdaNoreture1 lambdaNoreture1=a-> System.out.println("Hello" + a + b +"!"); lambdaNoreture1.method("Lam","bda"); } //输出HelloLambda!
四、因为每次要用到Lambda表达式都要创建一个相应的函数式接口,很麻烦,所以JDK8贴心的给我们做好了一些函数式接口,大部分情况下我们就不用新建接口了,直接用就可以,其中我们主要学习下四个最常用的接口;
1.第一个函数式接口Function<T,R>, Fcuntion接口会接收一个T(泛型)类型参数,返回R类型的结果的方法,通过调用apply方法执行内容。下面的例子是用Fcuntion来表白的例子
import java.util.function.Function; public class LambdaFcuntion { public static void main(String[] args) { Function<Double,Double> S=r->r*r*3.14+67.84; System.out.println(S.apply(12.0)); } } //输出:520.0
2.Predicate接口predicate<T,Boolean>,Predicate接口是一个用于判断的接口,平常可以用来当过滤器使用,有一个参数<T>和一个布尔类型的返回值,下面是一个判断是否成人的例子。
import java.util.function.Predicate; public class LambdaPredicate { public static void main(String[] args) { Predicate<Integer> predicate=age->age>=18; System.out.println(predicate.test(5)); System.out.println(predicate.test(20)); } } //test(5)输出结果:false //test(20)输出结果:true
3.Consume接口,Consum<T>也叫消费接口,该接口对应的方法类型为接收一个参数<T>,没有返回值,下面是一个例子。
import java.util.function.Consumer; public class Consum { public static void main(String[] args) { Consumer<String> printString = s -> System.out.println(s); printString.accept("消费成功,这是你的Consumer"); } } //输出结果:消费成功,这是你的Consumer
4.Supplier接口, 和Consume相反,他没有参数、只有返回值,所以也叫给予接口,可以使用get()方法获得这个返回值,下面是一个例子。
import java.util.function.Supplier; public class Supplier{ public static void main(String[] args) { Supplier<String> Supplier = () ->"I get Supplier"; System.out.println(Supplier.get()); } } //输出结果:I get Supplier