在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接口是一个用于判断的接口,平常可以用来当过滤器使用,有一个参数和一个布尔类型的返回值,下面是一个判断是否成人的例子。

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也叫消费接口,该接口对应的方法类型为接收一个参数,没有返回值,下面是一个例子。

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