JDK1.8 Lambda 表示式的學習
阿新 • • 發佈:2018-12-08
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");
}
}