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類型結果。