在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 S=r->r*r*3.14+67.84;
System.out.println(S.apply(12.0));
}
}
//输出:520.0
2.Predicate接口predicate<T,Boolean>,Predicate接口是一个用于判断的接口,平常可以用来当过滤器使用,有一个参数和一个布尔类型的返回值,下面是一个判断是否成人的例子。
import java.util.function.Predicate;
public class LambdaPredicate {
public static void main(String[] args) {
Predicate 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也叫消费接口,该接口对应的方法类型为接收一个参数,没有返回值,下面是一个例子。
import java.util.function.Consumer;
public class Consum {
public static void main(String[] args) {
Consumer 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