java se 8 學習(1、lambda初識)

還java8感受很新嘛? java

看看jdk.java.net中已經jdk12啦,那還不趕快學,再不學真來不及了 相信你們的項目裏面有不少已經用了jdk8了,可是又有多少真正使用的java8的新特性呢? 本人一邊學習一邊總結,但願也能夠對正在學習java8的javaer有所幫助吧

爲何使用lambda表達式?

咱們先看一下一些代碼原來的寫法吧,相信你們會異常熟悉的git

  • 實現Runnable接口來實現多線程的寫法
public class Worker implements Runnable {

    @Override
    public void run() {
        System.out.println("實現runnable接口,實現多線程");
    }
}

//實現多線程
Worker worker = new Worker();
new Thread(worker).start();
複製代碼
  • 實現Comparator接口來實現自定義比較器
public class LengthComparator implements Comparator<String> {

    @Override
    public int compare(String o1, String o2) {
        return Integer.compare(o1.length(), o2.length());
    }
}

String[] strings = new String[]{"tony", "a", "tom", "jack"};
Arrays.sort(strings, new LengthComparator());
複製代碼

上面量個例子都是將一個實現接口的類的對象傳遞給一個方法調用,由於在java8以前java是不支持將代碼塊作爲參數傳遞的github

lambda表達式使用

仍是使用上面的兩個實例多線程

  • 實現多線程
//java8
new Thread(() -> {
    System.out.println("lambda實現多線程"); 
}).start();
//只有一行簡化{}
new Thread(() -> System.out.println("lambda實現多線程")).start();
複製代碼
  • 實現比較器
//java8
Arrays.sort(strings, (first, second) -> {
    return Integer.compare(first.length(), second.length());
});
//代碼中只有return語句,可簡化
Arrays.sort(strings, (first, second) -> Integer.compare(first.length(), second.length()));
//參數調用其類的相同方法,再簡化
Arrays.sort(strings, Comparator.comparingInt(String::length));
複製代碼

和原來的寫法比較,java8的寫法是否是又簡單又炫酷。下面簡單的說一說語法吧,當時我也理解一會呢。若是你的JavaScript(ES6)寫的很6,那麼理解起來真的是如數家珍。ide

  • 從上面的兩個例子能夠看出,lambda表達式都是用於直接實現接口的,不須要類去實現了,咱們本身寫一個接口試試
public interface IOneMethods {

    void method();
}

void testOneMethod(IOneMethods iOneMethods){
    iOneMethods.method();
    System.out.println("爲了使用lambda表達式");
}

//一個抽象方法的接口用lambda
new Test().testOneMethod(() -> System.out.println("使用lambda表達式實現接口"));
複製代碼

這邊咱們看到接口裏面只有一個抽象方法,若是有兩個或者是多個可不可使用lambda表達式呢,咱們新建一個試一下就知道了函數

public interface ITwoMethods {

    void firstMethod();

    void secondMethod(String methodName);
}

void testTwoMethod(ITwoMethods iTwoMethods){
    System.out.println("爲了使用lambda表達式");
}

//兩個抽象方法的接口使用lambda
new Test().testTwoMethod(() -> System.out.println("使用lambda表達式實現接口"));
new Test().testTwoMethod((name) -> System.out.println(name));
複製代碼
  • 代碼很好看對吧,看下個人截圖,我還爲了區別兩個抽象方向,讓參數不同,結果仍是不行的,因此本身寫的接口只有一個抽象方法的時候纔可使用lambda表達式

因此這邊就引入一個新的概念——函數式接口

對於只包含一個抽象方法的接口,你可使用lambda表達式來建立該接口的對象。這種接口被稱爲函數式接口。當你但願使用lambda表達式的時候,你必需要記住表達式的目的,併爲他指定一個函數式接口。學習

  • 咱們能夠爲函數式接口添加@FunctionalInterface註解,編譯的時候和生成接口文檔的時候就會檢查和聲明這是一個函數式接口
@FunctionalInterface
public interface IOneMethods {

    void method();
}
複製代碼

方法的引用

上面咱們看到這樣一個符號 :: 實際上面這對對象方法的引用spa

//方法引用::
    List<String> stringList = Arrays.asList(strings);
// List<Integer> stringLength = stringList.stream().map(string -> string.length()).collect(Collectors.toList());
    List<Integer> stringLength = stringList.stream().map(String::length).collect(Collectors.toList());
複製代碼
  • 這邊裏面有一些steam的東西后面我會講的,咱們就看map裏面的 string -> string.length() length()方法是String類中的,因此咱們在lambda中能夠用 類名::方法 去實現,包括一個new對象的操做 Preson::new

以上屬於自學總結,若有有說的有問題的方法歡迎指出

代碼存於github上面也歡迎star.net

  • https://github.com/Radicalpro/LearningJDK8
相關文章
相關標籤/搜索