Java之函數式介面

來源:互聯網
上載者:User

標籤:lov   實現原理   推導   註解   public   jdk   存在   mes   pac   

函數式介面概述:介面中只有一個抽象方法

下面介紹的可能很抽象,理解不了,至少在我看來單獨的這幾個借口是沒有用的,跟最下面說的 Stream流一起用才會有效果

  • 函數式介面,即適用於函數式編程情境的介面。而Java中的函數式編程體現就是Lambda,所以函數式介面就是可
    以適用於Lambda使用的介面。只有確保介面中有且僅有一個抽象方法,Java中的Lambda才能順利地進行推導。

    備忘:“文法糖”是指使用更加方便,但是原理不變的代碼文法。例如在遍曆集合時使用的for-each文法,其實
    底層的實現原理仍然是迭代器,這便是“文法糖”。從應用程式層面來講,Java中的Lambda可以被當做是匿名內部
    類的“文法糖”,但是二者在原理上是不同的。

  • 格式:
    1. 只要確保介面中有且僅有一個抽象方法即可:

       修飾符 interface 介面名稱 {    public abstract 傳回值類型 方法名稱(選擇性參數資訊);    // 其他非抽象方法內容 }
    2. @FunctionalInterface註解

      與@Override 註解的作用類似,Java 8中專門為函數式介面引入了一個新的註解: @FunctionalInterface 。該注
      解可用於一個介面的定義上,一旦使用該註解來定義介面,編譯器將會強制檢查該介面是否確實有且僅有一個抽象方法,否則將會報錯。需要注
      意的是,即使不使用該註解,只要滿足函數式介面的定義,這仍然是一個函數式介面,使用起來都一樣。

    3. 自訂函數式介面(前面已經寫過,這就不重複寫了)

      package com.wzlove.function;

      /**
      • 自訂函數式介面
      • 使用@FunctionalInterface可以說明該介面是函數式介面,但是不加,如果介面中只有一個抽象方法,這個介面也是函數式介面
      • 也就是說函數式介面不以註解的存在而存在
        */
        @FunctionalInterface
        public interface MyFunctionalInterface {

        public abstract void show();
        }

lambda運算式: (參數列表)->{代碼}lambda運算式(前面有篇文章說過,不詳細說明)

有參數,有傳回值的自訂函數式介面

    @FunctionalInterface    public interface Sumable {        int sum(int a, int b);    }
JDK1.8之後的某些函數式介面supplier生產資料函數式介面

目的是生產資料.

目前好像看不出來有什麼用,但是好像和jdk8的Stream流有關.,舉個小例子

    package com.wzlove.supplier;        import java.util.function.Supplier;        /**     * 使用supplier函數式介面求數組的最大值     */    public class ArrMaxValue {            public static int getMaxValue(Supplier<Integer> sup){            return sup.get();        }            public static void main(String[] args) {            // 建立數組            int[] arr = {100,20,50,30,99,101,-50};                int maxValue = getMaxValue(()->{                int max = arr[0];                for (int i : arr) {                    if(i > max){                        max = i;                    }                }                return max;            });                System.out.println("數組中的最大值為:" + maxValue);        }        }
Consumer消費資料函數式介面

這個方法是用來消費資料的,如何消費,消費規則自己定義.

java.util.function.Supplier

package com.wzlove.comsumer;import java.util.function.Consumer;/** * 使用Consumer函數式介面實現格式化輸出 */public class ConsumerDemo2 {    public static void printInfo(String[] strArr, Consumer<String> con1, Consumer<String> con2){        for (int i = 0; i < strArr.length; i++) {            con1.andThen(con2).accept(strArr[i]);        }    }    public static void main(String[] args) {        String[] strArr = {"迪麗熱巴,女","鄭爽,女","楊紫,女"};        printInfo(strArr,(message)->{            System.out.print("姓名:" + message.split(",")[0] + "。  ");        },(message)->{            System.out.println("性別:" + message.split(",")[1] + "。");        });    }}
Predicate判斷函數式介面

Predicate 介面中包含一個抽象方法: boolean test(T t) 。用於條件判斷的情境

預設方法:

  • default Predicate
  • default Predicate
  • default Predicate

    package com.wzlove.functionalinterface.predicate;

    import java.util.ArrayList;
    import java.util.function.Predicate;

    /**
    • */
      public class PredicateDemo2 {

      /**
      • 檢查數組中的元素是否符合要求,滿足要求加入List中並返回
      • @param arr 需要判斷的數組
      • @param pre1 判斷介面1,判斷性別是否為女
      • @param pre2 判斷介面2,判斷姓名長度是否大於2
      • @return 集合
        */
        public static ArrayList

      public static void main(String[] args) {
      // 建立數組
      String[] arr = {"迪麗熱巴,女","楊洋,男","李溪芮,女","鄭爽,女"};

        // 調用方法(Lambda運算式可以簡化)  ArrayList<String> list = checkStar(arr,(str)->{      return str.split(",")[1].equals("女");  },(str)->{      return str.split(",")[0].length() > 2;  });  // 遍曆集合  for (String elem : list) {      System.out.print(elem + "   ");  }

      }

    }

Function類型轉換函式式介面

Function 介面中最主要的抽象方法為: R apply(T t) ,根據類型T的參數擷取類型R的結果。

Function 介面中有一個預設的andThen 方法,用來進行組合操作。

package com.wzlove.functionalinterface.function;import java.util.function.Function;/** * */public class FunctionDemo2 {    /**     * 將String分割,獲得第二個元素,將資料轉化為int,int資料加100,再將int轉化為String     * @param str    轉化的資料     * @param fun1   String -> String     * @param fun2   String -> Integer     * @param fun3   Integer -> String     * @return       最後的String     */    public static String convert(String str,                              Function<String,String> fun1,                              Function<String, Integer> fun2,                              Function<Integer,String> fun3){        return fun1.andThen(fun2).andThen(fun3).apply(str);    }    public static void main(String[] args) {        String str = convert("迪麗熱巴,23",(s)->{            return s.split(",")[1];        },(s)->{            return Integer.parseInt(s) + 100;        },(s)->{            return String.valueOf(s);        });        System.out.println(str);    }}

Java之函數式介面

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.