上一篇小樂帶你們學過 Java8新特性-Lambda表達式,那何時可使用Lambda?一般Lambda表達式是用在函數式接口上使用的。從Java8開始引入了函數式接口,其說明比較簡單:函數式接口(Functional Interface)就是一個有且僅有一個抽象方法,可是能夠有多個非抽象方法的接口。 java8引入@FunctionalInterface 註解聲明該接口是一個函數式接口。html
/** * 定義函數式接口 * 接口上標註@FunctionalInterface 註解 */ @FunctionalInterface public interface ICollectionService { /** * 定義打印方法 */ void print(); }
在Java8 之前,已有大量函數式接口形式的接口(接口中只存在一個抽象方法),只是沒有強制聲明。例如:java
Java8 新增長的函數接口在java.util.function 包下,它包含了不少類,用來支持 Java的 函數式編程,該包中的函數式接口有:編程
對於Java8中提供的這麼多函數式接口,開發中經常使用的函數式接口有如下幾個:session
java.util.function.Predicate<T> 接口定義了一個名叫 test 的抽象方法,它接受泛型 T 對象,並返回一個boolean值。在對類型 T進行斷言判斷時,可使用這個接口。一般稱爲斷言性接口 。app
使用Predicate接口實現字符串判空操做函數式編程
@FunctionalInterface public interface Predicate<T> { /** * Evaluates this predicate on the given argument. * * @param t the input argument * @return {@code true} if the input argument matches the predicate, * otherwise {@code false} */ boolean test(T t); ... } public static void main(String[] args) { /** * 藉助Lambda 表達式實現Predicate test方法 */ Predicate<String> p01=(str)->str.isEmpty()||str.trim().isEmpty(); /** * 測試傳入的字符串是否爲空 */ System.out.println(p01.test("")); System.out.println(p01.test(" ")); System.out.println(p01.test("admin")); }
測試代碼函數
public static void main(String[] args) { /** * 藉助Lambda 表達式實現Predicate test方法 */ Predicate<String> p01=(str)->str.isEmpty()||str.trim().isEmpty(); /** * 測試傳入的字符串是否爲空 */ System.out.println(p01.test("")); System.out.println(p01.test(" ")); System.out.println(p01.test("admin")); }
測試結果:測試
java.util.function.Consumer<T>接口定義了一個名叫 accept 的抽象方法,它接受泛型T,沒有返回值(void)。若是須要訪問類型 T 的對象,並對其執行某些操做,可使用這個接口,一般稱爲消費性接口。this
使用Consumer實現集合遍歷操做:加密
@FunctionalInterface public interface Consumer<T> { /** * Performs this operation on the given argument. * * @param t the input argument */ void accept(T t); ... } /** * 藉助Lambda表達式實現Consumer accept方法 */ Consumer<Collection> c01 = (collection) -> { if (null != collection && collection.size() > 0) { for (Object c : collection) { System.out.println(c); } } }; List<String> list = new ArrayList<String>(); list.add("諸葛亮"); list.add("曹操"); list.add("關羽"); // 遍歷list 輸出元素內容到控制檯 c01.accept(list);
java.util.function.Function<T, R>接口定義了一個叫做apply的方法,它接受一個泛型T的對象,並返回一個泛型R的對象。若是須要定義一個Lambda,將輸入的信息映射到輸出,可使用這個接口(好比提取蘋果的重量,或把字符串映射爲它的長度),一般稱爲功能性接口。
使用Function實現用戶密碼 Base64加密操做:
@FunctionalInterface public interface Function<T, R> { /** * Applies this function to the given argument. * * @param t the function argument * @return the function result */ R apply(T t); } // 實現用戶密碼 Base64加密操做 Function<String,String> f01=(password)->Base64.getEncoder().encodeToString(password.getBytes()); // 輸出加密後的字符串 System.out.println(f01.apply("123456"));
加密後結果以下:
java.util.function.Supplier<T>接口定義了一個get的抽象方法,它沒有參數,返回一個泛型T的對象,這相似於一個工廠方法,一般稱爲功能性接口。
使用Supplier實現SessionFactory建立:
@FunctionalInterface public interface Supplier<T> { /** * Gets a result. * * @return a result */ T get(); } /** * 產生一個session工廠對象 */ Supplier<SessionFactory> s = () -> { return new SessionFactory(); }; s.get().info();
以上就是小樂帶給你們的Java8新特性之函數式接口,下一篇將會爲你們帶來Java8新特性之方法引用,敬請關注。
轉載請註明文章出處和做者,謝謝合做!