Java 8新特性內建函數式接口
在之前的一片博文 Lambda 表達式,提到過Java 8提供的函數式接口。在此文中,將介紹一下Java 8四個最基本的函數式接口
對于方法的引用,嚴格來講都需要定義一個接口。不管我們如何操作實際上有可能操作的接口只有四種。
Java 8 提供了函數式接口包java.util.function.*,在該包下有許多Java 8內建的函數式接口。不過基本上分為四種基本的:
功能型接口 (Function)
將 T 作為輸入,返回 R 作為輸出,他還包含了和其他函數組合的默認方法。
1
2
3
4
5
6
7
|
@FunctionalInterface public interface Function<T, R> { R apply(T t); } |
示例代碼
1
2
3
4
5
6
7
8
|
public static void main(String[] args) { // 這里用到了Java8的 方法引用,功能型函數式接口! Function<String,Boolean> function = "Hello Java" :: endsWith; System.out.println(function.apply( "Java" )); } |
消費型接口 (Consumer)
將 T 作為輸入,不返回任何內容,表示在單個參數上的操作。
1
2
3
4
5
6
7
|
@FunctionalInterface public interface Consumer<T> { void accept(T t); } |
示例代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
class TestDemo{ //此方法沒有返回值,但是有輸入參數 public void fun(String str){ System.out.println(str); } } public class TestFunctional { public static void main(String[] args) { TestDemo demo = new TestDemo(); //消費型接口,只有輸入參數,沒有輸出參數 Consumer<String> consumer = demo :: fun; consumer.accept( "" ); } } <br> |
供應型接口 (Supplier)
沒有輸入參數,只有T返回輸出
1
2
3
4
5
6
|
@FunctionalInterface public interface Supplier<T> { T get(); } |
示例代碼
1
2
3
4
5
6
7
8
|
public class TestFunctional { public static void main(String[] args) { //供應商類型接口,只有輸出參數,沒有輸入參數! Supplier<String> supplier = "java 8" :: toUpperCase; System.out.println(supplier.get()); } } |
斷言型接口 (Predicate)
將 T 作為輸入,返回一個布爾值作為輸出,該接口包含多種默認方法來將 Predicate 組合成其他復雜的邏輯(與、或、非)。
1
2
3
4
5
6
7
|
@FunctionalInterface public interface Predicate<T> { boolean test(T t); } |
示例代碼
1
2
3
4
5
6
7
8
9
|
public class TestFunctional { public static void main(String[] args) { //斷言類型接口。有輸入參數,輸出參數為布爾值 Predicate<String> predicate = "Android" :: equalsIgnoreCase; System.out.println(predicate.test( "android" )); } } |
所以在Java 8中由于存在有以上的四個功能型接口,所以一般很少會由用戶去定義新的函數式接口!
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
原文鏈接:http://www.cnblogs.com/MPPC/p/5357572.html