天天看點

JDK8函數式接口函數式接口

JDK8新特性函數式接口

  • 函數式接口
    • Jdk8中提供了很多函數式接口其中列舉了4中常用的函數式接口
    • Lambda表達式
    • Predicate
    • Predicate代碼執行個體
    • Consumer
    • Consumer代碼執行個體
    • Function
    • Function代碼執行個體
    • 方法引用
    • 文法糖
    • Supplier
    • Supplier 代碼執行個體
    • 總結

函數式接口

顧名思義,它是一個接口,有且隻有一個抽象方法,需要注意的是接口的預設方法和靜态方法并不影響一個接口成為函數式接口。

Jdk8中提供了很多函數式接口其中列舉了4中常用的函數式接口

接口	       參數	  傳回類型	        描述
 Predicate	T	      boolean	           用于判别一個對象。比如求一個人是否為男性
 Consumer  T	     void	               用于接收一個對象進行處理但沒有傳回,比如接收一個人并列印他的名字
 Function	    T	      R	                   轉換一個對象為不同類型的對象
 Supplier	   None  T	                   提供一個對象
           

Lambda表達式

lamdba表達式,()->{}; 如果沒有參數可以在()不寫,有參數要寫,可以不用寫參數類型,如果該參數需要被final等修飾符修飾需要加上參數類型。下面是使用方法

players.forEach((player) -> System.out.print(player + "; "));

Predicate

Predicate是一個函數式接口,它主要用來進行對比,進行比較兩個值的不同或者對象中的值是否是給定的值,傳回值為boolean類型

下面是一個執行個體

Predicate代碼執行個體

編寫一個getSex方法 傳入參數 sex 和Predicate接口

private static boolean getSex(char sex,Predicate<Character> pre){ return pre.test(sex); }

在main方法中進行實作

//判斷是否為男
        getSex('男',(sex)->{
            if (sex=='男'){
                System.out.println("他是男的");
                return true;
            }
            return false;
        });
           

Consumer

Consumer 函數式接口,主要是用來消費一個對象,或者資料 傳回值是void。這樣了解起來非常麻煩,我們可以通過下面的代碼執行個體來看一下。

Consumer代碼執行個體

編寫一個getName方法 傳入參數 name 和Consumer接口

private static void getName(String name, Consumer<String> con){
        con.accept(name);
    }
           

在main方法中進行實作

getName("mcshangyun",(name)->{
            System.out.println(name);
        });
           

Function

主要是用來轉換對象的類型,傳回任意的資料類型。

Function代碼執行個體

編寫一個getInt方法 傳入參數String類型的 id 和Function接口

private static int getInt(Function<String,Integer> function,String id){
        return function.apply(id);
    }
           

在main方法中進行實作

getInt(Integer::parseInt,"654321");
           

在這裡是不是發現沒有看懂getInt的方法是怎麼實作的 ,它使用的是方法引用的方式 下面我們介紹下方法的引用

方法引用

方法引用得簡介:

方法引用與構造器引用

方法引用

當要傳遞給Lambda體的操作,已經有實作的方法了,可以使用方法引用!

方法引用就是Lambda表達式,就是函數式接口的一個執行個體,通過方法的名字來指向一個方法,可以認為是Lambda表達式的一個文法糖。

要求:實作抽象方法的參數清單和傳回值類型,必須與方法引用的方法的參數清單和傳回值類型保持一緻!

方法引用:使用操作符 “::” 将類(或對象) 與 方法名分隔開來。

如下三種主要使用情況: 對象::執行個體方法名

類::靜态方法名

類::執行個體方法名

實作抽象方法的參數清單和傳回值類型,必須與方法引用的方法的參數清單和傳回值類型保持一緻" 這句話很重要,一定要了解

我的了解是:

舉個例子

Comparator comparator = (x,y)->Integer.compare(x, y);等同于

Comparator comparator1 = Integer::compare;

即:方法引用的方法是Integer的compare吧,他的參數清單是兩個integer類型,傳回值是int

方法引用的前提是:

方法引用得前提是

  • 1.對象已經存在     2.類是存在得          3.super是存在的      4.this是存在               5.構造器是存在的   6 數組的建立文法
               
  • 1.方法已經存在     2.靜态方法也是存在的   3.父類的方法是存在的  4.本類中的方法也是存在的     5.建立對象 new
               
  • 1.對象::方法名     2.Math::abs           3.super::方法名稱    4.this::方法名稱            5.類名::new       6 int [] ::new
               

其中又引出一個關鍵詞 文法糖

文法糖

“文法糖”這個詞絕非貶義詞,它可以給我們帶來友善,是一種便捷的寫法,編譯器會幫我們做轉換;而且可以提高開發編碼的效率,在性能上也不會帶來損失。

Supplier

Supplier是用來建立對象的,但是不同于傳統的建立對象文法:new 下面的方法有得用得是方法引用,利用supplier比較數組中的大小 使用的方式是lambda表達式

Supplier 代碼執行個體

編寫一個getMax方法Supplier接口

private static int getMax(Supplier<Integer> supplier){
        return supplier.get();
    }
           

在main方法中進行實作

int [] arr ={100,-50,99,210,66,70};
        //這裡使用的是lambda表達式   也隻有函數式接口才能用 函數式接口:有且隻有一個抽象方法
        int maxValue=getMax(()->{
            int max =arr[0];
            for (int i=1;i<arr.length;i++){
                if (max<arr[i]){
                    max=arr[i];
                }
            }
            return max;
        });
        System.out.println(maxValue);
           

總結

總的來說  函數式接口的主要展現在Stream流中,下篇文章會寫一下Stream的應用。每天進步一點點,迎娶白富美
嘿嘿,當然這些都是不存在的,還是洗洗睡吧