lambda從精通到陌生

1.爲什麼用lambda

簡化我們的操作
舉個老栗子
創建一個線程

 new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("hh");
            }
        }).start();

以前我們快速創建一個線程要這樣
現在用lambda

 new Thread(()-> System.out.println("lambda-->hh")).start();

一個更重要的原因是Java 以後爲了更好的函數式編程

2.lambda怎麼用

2.1 lambda的使用場景

lambda只能用在函數式接口,函數式接口就是一個接口裏面只有一個抽象方法

 * @author  Arthur van Hoff
 * @see     java.lang.Thread
 * @see     java.util.concurrent.Callable
 * @since   JDK1.0
 */
@FunctionalInterface
public interface Runnable {
    /**
     * When an object implementing interface <code>Runnable</code> is used
     * to create a thread, starting the thread causes the object's
     * <code>run</code> method to be called in that separately executing
     * thread.
     * <p>
     * The general contract of the method <code>run</code> is that it may
     * take any action whatsoever.
     *
     * @see     java.lang.Thread#run()
     */
    public abstract void run();
}

可以通過@FunctionalInterface來表示是一個函數式接口
Java 爲我們創建了很多常用的函數式接口,不用我們一個一個來創建
四大內置函數式接口
Consumer< T > 消費性 接口: void accept(T t);
Supplier< T > 供給型接口 : T get();
Function< T , R > 函數式接口 : R apply (T t);
Predicate< T > 斷言形接口 : boolean test(T t);

2.2 使用

(參數)->{方法體}

 new Thread(()-> { System.out.println("lambda-->hh");}).start();

其實到這就可以熟練的用lambda,但是它還能簡化,你說氣不氣=。=

1.一個參數時可省略()

        Consumer<String> consumer = x -> System.out.println(x);
        consumer.accept("1個參數省略()");

2.方法體只有一條語句省略{}
== 不管它是否需要有返回值==

       Function<Integer,Integer> function= x-> x;
        Integer apply = function.apply(1);
        System.out.println(apply);

3.類型推斷
lambda 表達式的參數類型可省略不寫
聰明的你肯定發現了爲什麼參數 不需要寫類型,爲什麼不需要,Java會根據泛型來推斷
你也可以指定參數的類型,但是沒必要
在這裏插入圖片描述

        Consumer<String> consumer = (String x) -> System.out.println(x);

3.方法引用

    System.out.println("呼呦呦");
    
    public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

println是一個參數沒有返回
這和Consumer 消費者接口很符合啊,下面這樣寫可不可以簡化啊(就nm事多)

   Consumer<String> consumer = x -> System.out.println(x);

簡化版

        Consumer<String> consumer1 = System.out::println;

方法引用 參數與返回值需要一致

    /**
     * 方法引用  如果lambda體中有方法已經實現,我們可以使用 方法引用   參數與返回值需要一致
     * <p>
     * 主要有3種
     * 對象::實例方法
     * 類::靜態方法
     * 類::實例方法
     * <p>
     * 構造器引用
     * 調用的構造方法與傳入的參數有關
     * <p>
     * 數組引用
     * Type[]:new;
     */

現在你肯定迷茫了,感覺不經常用到啊,下一篇Java 流Stream

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章