1. 程式人生 > >JDK1.8 Lambda 表示式的學習

JDK1.8 Lambda 表示式的學習

1、Lambda  表示式

Lambda 表示式(也稱為閉包)是整個Java8發行版本中最受期待的在Java語言層面上的改變,Lambda 允許把函式作為一個方法的引數(函式作為引數傳遞進方法中),或者把程式碼看成資料,Lambda 表示式用於簡化Java中介面式的匿名內部類,被稱為函式式介面的概念,函式式介面就是一個具有一個方法的普通介面,像這樣的介面,可以被隱式轉換為Lambda 表示式。

語法:

(引數1,引數2...)->(...)

(1)沒有引數的時候使用Lambda 表示式

(2)帶引數時使用Lambda 表示式

(3)程式碼塊中只一句程式碼時使用Lambda 表示式

(4)程式碼塊中有多句程式碼時使用Lambda 表示式

(5)有返回值的程式碼塊

(6)引數中使用final 關鍵字

/**
 * @Date: 2018/12/8 10:23
 * @Description:
 */
public class LambdaDemo {

//    public static void main(String args[]) {
//        IEat iEat = new IEatImpl();
//        iEat.eat();
//
//        //匿名內部類的使用
//        IEat iEat1 = new IEat() {
//            public void eat() {
//                System.out.println("eat banana");
//            }
//        };
//        iEat1.eat();
//
//        //Lambda 表示式
//        //好處:1.程式碼更加的簡介;2.不會單獨生成class檔案
//        //一個介面中只有一個方法的時候能使用Lambda 表示式
//        //如果一個介面有多個方法就不能使用Lambda 表示式,只能用傳統的匿名內部類
//        //IEat iEat2 = () ->{ System.out.println("eat peach");};
//
//        //沒有引數時候的使用
//        IEat iEat2 = () -> System.out.println("eat peach");
//        iEat2.eat();
//    }

    public static void main(String args[]) {

        //1.帶引數時使用,引數的型別可以省略
//        IEat iEat = (thing,name) -> System.out.printf("eat:", thing + "...." + name);
//        iEat.eat("apple","anf");

        //2.帶引數時使用,引數的型別可以省略,程式碼中有多行引數
//        IEat iEat = (thing,name) -> {
//            System.out.printf("eat:", thing);
//            System.out.println(name);
//        };
//        iEat.eat("apple","anf");

        //3.帶返回值的方法
//        IEat iEat = (thing , name) ->{
//            System.out.println(name + "eat" + thing);
//            int i = 10;
//            return i;
//        };
//        iEat.eat();

        //4.帶返回值的方法中只有一句實現程式碼
//        IEat iEat = (thing , name) -> thing == null?1:0;
//        iEat.eat();

        //5.引數中使用final 關鍵字
//        IEat iEat = (final String thing ,final String name) -> thing == null?1:0;
//        iEat.eat();
    }
}

//只有一個抽象方法的介面
interface IEat{
    public void eat();

    public void eat(final String thing,final String name);
}

//實現類
class IEatImpl implements IEat{

    public void eat() {
        System.out.println("eat apple");
    }

    @Override
    public void eat(String thing,String name) {
        System.out.println("string thing");
    }
}

2.介面中的預設方法和靜態方法

interface A{
   public default void print(){};
   public static void method(){};
}

預設方法與靜態方法並不影響函式式介面的契約,可以任意使用。

package demo;

import lombok.Data;

/**
 * @Date: 2018/12/8 11:14
 * @Description:
 */
@Data
public class Student {

    private String name;
    private Integer age;

    public Student(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

}
import demo.Student;

import java.util.Arrays;
import java.util.Comparator;

/**
 * @Date: 2018/12/8 10:23
 * @Description:
 */
public class LambdaDemo {

    public static void main(String args[]) {


        //排序
        //Comparator<Student> comparator = (o1,o2) ->o1.getAge() - o2.getAge();
        Arrays.sort(students,(o1,o2) ->o1.getAge() - o2.getAge());
        System.out.println(Arrays.toString(students));
    }
}

//只有一個抽象方法的介面
interface IEat{
    public void eat();

    public void eat(final String thing,final String name);

    //預設方法, 預設方法與靜態方法並不影響函式式介面的契約,可以任意使用。
    public default void print(){
        System.out.println("print test");
    }

    //靜態方法 ,預設方法與靜態方法並不影響函式式介面的契約,可以任意使用。
    public static void method(){
        System.out.println("static method");
    }

}

//實現類
class IEatImpl implements IEat{

    public void eat() {
        System.out.println("eat apple");
    }

    @Override
    public void eat(String thing,String name) {
        System.out.println("string thing");
    }
}