大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

專注Java教育14年 全國咨詢/投訴熱線:400-8080-105
動力節(jié)點LOGO圖
始于2009,口口相傳的Java黃埔軍校
首頁 hot資訊 實例分析函數(shù)式接口

實例分析函數(shù)式接口

更新時間:2020-10-20 17:55:46 來源:動力節(jié)點 瀏覽1174次

函數(shù)式接口,即適用于函數(shù)式編程場景的接口。而Java中的函數(shù)式編程體現(xiàn)就是Lambda,所以函數(shù)式接口就是可以適用于Lambda使用的接口。只有確保接口中有且僅有一個抽象方法,Java中的Lambda才能順利地進行推導。


“語法糖”是指使用更加方便,但是原理不變的代碼語法。例如在遍歷集合時使用的for-each語法,其實底層的實現(xiàn)原理仍然是迭代器,這便是“語法糖”。從應用層面來講,Java中的Lambda可以被當做是匿名內(nèi)部

類的“語法糖”,但是二者在原理上是不同的。

格式:只要確保接口中有且僅有一個抽象方法即可:

修飾符 interface 接口名稱 {

public abstract 返回值類型 方法名稱(可選參數(shù)信息);

// 其他非抽象方法內(nèi)容

}

@FunctionalInterface注解

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

自定義函數(shù)式接口(前面已經(jīng)寫過,這就不重復寫了)

package com.wzlove.function;

/**

自定義函數(shù)式接口

使用@FunctionalInterface可以說明該接口是函數(shù)式接口,但是不加,如果接口中只有一個抽象方法,這個接口也是函數(shù)式接口

也就是說函數(shù)式接口不以注解的存在而存在

*/

@FunctionalInterface

public interface MyFunctionalInterface {

public abstract void show();

}

lambda表達式: (參數(shù)列表)->{代碼}

lambda表達式(前面有篇文章說過,不詳細說明)

有參數(shù),有返回值的自定義函數(shù)式接口

@FunctionalInterface

public interface Sumable {

int sum(int a, int b);

}

JDK1.8之后的某些函數(shù)式接口

supplier生產(chǎn)數(shù)據(jù)函數(shù)式接口,目的是生產(chǎn)數(shù)據(jù)。

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

package com.wzlove.supplier;

import java.util.function.Supplier;

/**

* 使用supplier函數(shù)式接口求數(shù)組的最大值

*/

public class ArrMaxValue {

public static int getMaxValue(Suppliersup){

return sup.get();

}

public static void main(String[] args) {

// 創(chuàng)建數(shù)組

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("數(shù)組中的最大值為:" + maxValue);

}

}

Consumer消費數(shù)據(jù)函數(shù)式接口

這個方法是用來消費數(shù)據(jù)的,如何消費,消費規(guī)則自己定義.

java.util.function.Supplier 接口僅包含一個無參的方法: T get() 。用來獲取一個泛型參數(shù)指定類型的對

象數(shù)據(jù)。由于這是一個函數(shù)式接口,這也就意味著對應的Lambda表達式需要“對外提供”一個符合泛型類型的對象

數(shù)據(jù)。

package com.wzlove.comsumer;

import java.util.function.Consumer;

/**

* 使用Consumer函數(shù)式接口實現(xiàn)格式化輸出

*/

public class ConsumerDemo2 {

public static void printInfo(String[] strArr, Consumercon1, Consumercon2){

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判斷函數(shù)式接口

Predicate 接口中包含一個抽象方法: boolean test(T t) 。用于條件判斷的場景

默認方法:

default Predicate and(Predicate other) : 將兩個Predicate 條件使用“與”邏輯連接起來實現(xiàn)“并且”的效果

default Predicate or(Predicate other) : or 實現(xiàn)邏輯關系中的“或”

default Predicate negate() : 取反

package com.wzlove.functionalinterface.predicate;

import java.util.ArrayList;

import java.util.function.Predicate;

/**

*

*/

public class PredicateDemo2 {

/**

* 檢查數(shù)組中的元素是否符合要求,滿足要求加入List中并返回

* @param arr 需要判斷的數(shù)組

* @param pre1 判斷接口1,判斷性別是否為女

* @param pre2 判斷接口2,判斷姓名長度是否大于2

* @return 集合

*/

public static ArrayListcheckStar(String[] arr, Predicatepre1, Predicatepre2){

// 創(chuàng)建集合

ArrayListlist = new ArrayList<>();

for (String s : arr) {

if( pre1.and(pre2).test(s)){

list.add(s);

}

}

return list;

}

public static void main(String[] args) {

// 創(chuàng)建數(shù)組

String[] arr = {"迪麗熱巴,女","楊洋,男","李溪芮,女","鄭爽,女"};

// 調(diào)用方法(Lambda表達式可以簡化)

ArrayListlist = checkStar(arr,(str)->{

return str.split(",")[1].equals("女");

},(str)->{

return str.split(",")[0].length() > 2;

});

// 遍歷集合

for (String elem : list) {

System.out.print(elem + " ");

}

}

}


Function類型轉(zhuǎn)換函數(shù)式接口

Function 接口中最主要的抽象方法為: R apply(T t) ,根據(jù)類型T的參數(shù)獲取類型R的結(jié)果。

Function 接口中有一個默認的andThen 方法,用來進行組合操作。

package com.wzlove.functionalinterface.function;

import java.util.function.Function;

/**

*

*/

public class FunctionDemo2 {

/**

* 將String分割,獲得第二個元素,將數(shù)據(jù)轉(zhuǎn)化為int,int數(shù)據(jù)加100,再將int轉(zhuǎn)化為String

* @param str 轉(zhuǎn)化的數(shù)據(jù)

* @param fun1 String -> String

* @param fun2 String -> Integer

* @param fun3 Integer -> String

* @return 最后的String

*/

public static String convert(String str,

Functionfun1,

Functionfun2,

Functionfun3){

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);

}

}


看完了上面的諸多實例,相信你對函數(shù)式接口和Lambda表達式都有了一定的了解,作為Java1.8的新特性函數(shù)式接口是目前Java接口中最需要我們學習的一個,如果你覺得還沒有完全掌握函數(shù)式接口也沒有關系,隨時可以來本站的Java基礎教程觀看學習。


提交申請后,顧問老師會電話與您溝通安排學習

免費課程推薦 >>
技術文檔推薦 >>
主站蜘蛛池模板: 亚洲日韩色综合视频 | 国自产拍在线视频天天更新 | 精品国产乱码一区二区三区麻豆 | 欧美黑大粗硬毛片视频 | 国产在线一区视频 | 亚洲美色综合天天久久综合精品 | 99在线精品日韩一区免费国产 | 成人在线不卡视频 | 全免费a级毛片免费看不卡 全免费a级毛片免费看视频免 | 亚洲综合在线成人一区 | 这里只有久久精品视频 | 国产成人免费视频 | 奇米影视第四色首页 | 欧美中文字幕一二三四区 | 精品免费久久久久久久 | 久久久男女野外野战 | 黄色小视频免费看 | 麻豆久久婷婷综合五月国产 | 国产精品久久久亚洲 | 国产成人h片视频在线观看 国产成人h综合亚洲欧美在线 | 日日日日操 | 欧美一级美片在线观看免费 | 日韩一区国产二区欧美三区 | 精品久久久久久久一区二区手机版 | 久久精品国产6699国产精 | 国产成人乱码一区二区三区 | 好吊妞乱淫欧美 | 亚洲天堂777 | 国产精品午夜免费福利视频 | 青青在线精品视频 | 成人欧美视频 | 91精品免费高清在线 | 一级毛片一级毛片一级级毛片 | 四虎在线最新永久免费播放 | 超清波多野结衣精品一区 | 国产大片在线观看 | 天天干天天操天天摸 | 成熟的女性强烈交性视频 | 久久夜色撩人精品国产 | 欧美成人在线观看 | 亚洲一区二区三区成人 |