天天看點

java基礎:java8新特性函數式接口

1、定義

/**
 * 隻有一個抽象方法的接口稱為函數式接口
 * 可以靜态常量、靜态方法、預設方法、私有方法,隻要滿足隻有一個抽象方法就行(public abstract 修飾的方法)
 * 可通過注解@function interface檢查一個接口是不是函數式接口
 */
@FunctionalInterface
public interface Thing {
    //靜态常量
    public static final String STR="hello word";
    //抽象方法
    public abstract void material();
    /*
    預設方法,有這樣一些場景,如果一個接口要添加一個方法,那所有的接口實作類都要去實作,
    而某些實作類根本就不需要實作這個方法也要寫一個空實作,是以接口預設方法(default修飾的方法)就是為了解決這個問題。
     */
    default void nameString(){ }
    /*
    靜态方法,接口靜态方法(static修飾)類似于預設方法,但是我們不能在實作類中覆寫它們,可以避免預設方法在實作類中被覆寫實作。
     */
    public static void name(){}
    //私有方法(java9之後新加)
}      

2、函數式接口使用場景

2.1、函數式接口作為方法參數

forEach(Consumer<? super E> action)      

2.2、函數式接口作為方法傳回值

public class ComparatorDemo {
    public static void main(String[] args) {
        ArrayList<String> array = new ArrayList<>();
        array.add("a");
        array.add("ccccc");
        array.add("bb");
        array.add("ddd");
        System.out.println("排序前" + array);

        Collections.sort(array, getComparator());

        System.out.println("排序後" + array);

    }

    private static Comparator<String> getComparator() {
        /*  使用匿名内部類
        Comparator<String> comp = new Comparator<String>() {
            @Override
            public int compare(String s1, String s2) {
                return s1.length()-s2.length();
            }
        };
        return comp;
         */
    }
}      

2.3、函數式接口作為匿名内部類

Runnable r = new Runnable(){
            @Override
            public void run() {
                System.out.println("My Runnable");
            }};      

3、java8中的函數式接口

java.util.function 它包含了很多類,用來支援 Java的 函數式程式設計,該包中的函數式接口有

1 BiConsumer<T,U>

代表了一個接受兩個輸入參數的操作,并且不傳回任何結果

2 BiFunction<T,U,R>

代表了一個接受兩個輸入參數的方法,并且傳回一個結果

3 BinaryOperator

代表了一個作用于于兩個同類型操作符的操作,并且傳回了操作符同類型的結果

4 BiPredicate<T,U>

代表了一個兩個參數的boolean值方法

5 BooleanSupplier

代表了boolean值結果的提供方

6 Consumer

代表了接受一個輸入參數并且無傳回的操作

7 DoubleBinaryOperator

代表了作用于兩個double值操作符的操作,并且傳回了一個double值的結果。

8 DoubleConsumer

代表一個接受double值參數的操作,并且不傳回結果。

9 DoubleFunction

代表接受一個double值參數的方法,并且傳回結果

10 DoublePredicate

代表一個擁有double值參數的boolean值方法

11 DoubleSupplier

代表一個double值結構的提供方

12 DoubleToIntFunction

接受一個double類型輸入,傳回一個int類型結果。

13 DoubleToLongFunction

接受一個double類型輸入,傳回一個long類型結果

14 DoubleUnaryOperator

接受一個參數同為類型double,傳回值類型也為double 。

15 Function<T,R>

接受一個輸入參數,傳回一個結果。

16 IntBinaryOperator

接受兩個參數同為類型int,傳回值類型也為int 。

17 IntConsumer

接受一個int類型的輸入參數,無傳回值 。

18 IntFunction

接受一個int類型輸入參數,傳回一個結果 。

19 IntPredicate

:接受一個int輸入參數,傳回一個布爾值的結果。

20 IntSupplier

無參數,傳回一個int類型結果。

21 IntToDoubleFunction

接受一個int類型輸入,傳回一個double類型結果 。

22 IntToLongFunction

接受一個int類型輸入,傳回一個long類型結果。

23 IntUnaryOperator

接受一個參數同為類型int,傳回值類型也為int 。

24 LongBinaryOperator

接受兩個參數同為類型long,傳回值類型也為long。

25 LongConsumer

接受一個long類型的輸入參數,無傳回值。

26 LongFunction

接受一個long類型輸入參數,傳回一個結果。

27 LongPredicate

R接受一個long輸入參數,傳回一個布爾值類型結果。

28 LongSupplier

無參數,傳回一個結果long類型的值。

29 LongToDoubleFunction

接受一個long類型輸入,傳回一個double類型結果。

30 LongToIntFunction

接受一個long類型輸入,傳回一個int類型結果。

31 LongUnaryOperator

接受一個參數同為類型long,傳回值類型也為long。

32 ObjDoubleConsumer

接受一個object類型和一個double類型的輸入參數,無傳回值。

33 ObjIntConsumer

接受一個object類型和一個int類型的輸入參數,無傳回值。

34 ObjLongConsumer

接受一個object類型和一個long類型的輸入參數,無傳回值。

35 Predicate

接受一個輸入參數,傳回一個布爾值結果。

36 Supplier

無參數,傳回一個結果。

37 ToDoubleBiFunction<T,U>

接受兩個輸入參數,傳回一個double類型結果

38 ToDoubleFunction

接受一個輸入參數,傳回一個double類型結果

39 ToIntBiFunction<T,U>

接受兩個輸入參數,傳回一個int類型結果。

40 ToIntFunction

接受一個輸入參數,傳回一個int類型結果。

41 ToLongBiFunction<T,U>

接受兩個輸入參數,傳回一個long類型結果。