中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java8中怎么實現函數入參

發布時間:2021-07-14 13:52:17 來源:億速云 閱讀:606 作者:Leah 欄目:大數據

今天就跟大家聊聊有關Java8中怎么實現函數入參,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

1. 前情回顧

Java8支持將函數作為參數傳遞到另一個函數內部,在第一篇學習筆記中也簡單提到了這個用法。但是在第一篇學習的時候,還是困惑的,先說下我的困惑。

在第一篇中提到函數入參,入參的類型要先定義一個接口:

public interface Predicate<T> {
    boolean test(T t);
}

然后定義一個函數如下:

public static List<Apple> filterApples(List<Apple> inventory,Predicate<Apple> predicate){
    List<Apple> result = new ArrayList<>();

    for(Apple apple:inventory){
        if(predicate.test(apple)){
            result.add(apple);
        }
    }
    return result;
}

最后調用該方法:

List<Apple> filterGreenApples= filterApples(originApples,Apple::isGreenApple);

這里問題就來了,入參類型是一個接口Predicate,那實際入參不應該是這個接口的實現類的對象嗎,為什么直接就傳了這個靜態方法呢?

帶著這個問題,開始再繼續學習一下函數入參這塊內容。

2. 繼續學習

要理清函數作為參數傳遞這塊內容,還得先從最簡單的實現看起。在學習設計模式的時候,有了解過策略模式。第一個文章蘋果那個demo為例,加上策略模式。

首先定義一個接口,后面實現的所有策略都基于該接口:

public interface ApplePredicate<T> {
    boolean test(T t);
}

接著實現兩個篩選蘋果的策略:一個是根據顏色進行篩選,另一個是根據重量進行篩選:

public class filterAppleByColorPredicate implements Predicate<Apple> {
    @Override
    public boolean test(Apple apple) {
        return "green".equals(apple.getColor());
    }
}

public class filterAppleByWeightPredicate implements Predicate<Apple> {
    @Override
    public boolean test(Apple apple) {
        return apple.getWeight() > 15;
    }
}

最后main方法實現如下:

public static void main(String[] args){
		List<Apple> inventory = ...;
    
    // 選擇根據顏色過濾的策略過濾
    ApplePredicate colorPredicate = new filterAppleByColorPredicate();
    filterApples(inventory,colorPredicate);
    
    // 選擇根據重量過濾的策略過濾
    ApplePredicate weightPredicate = new filterAppleByWeightPredicate();
    filterApples(inventory,weightPredicate);
    
}

public static List<Apple> filterApples(List<Apple> inventory,ApplePredicate<Apple> predicate){
    List<Apple> result = new ArrayList<>();

    for(Apple apple:inventory){
        if(predicate.test(apple)){
            result.add(apple);
        }
    }
    return result;
}

這樣就實現了一個基于策略模式的代碼。

3. 匿名類

在第二小節的基礎上,直接使用匿名類,省去了各種策略的實現類的定義:

filterApples(inventory,new ApplePredicate<Apple>() {
	public boolean test(Apple apple){
		return "green".equals(apple.getColor());
	}
});

4. Lambda表達式

第三小節使用匿名類,但是當代碼量多了以后,還是顯得累贅,為此引入Lambda表達式來簡化編寫:

filterApples(inventory,(Apple apple) -> "green".equals(apple.getColor()));

關于Lambda這里我還是有疑問的,假如接口定義了兩個方法:

public interface ApplePredicate<T> {
    boolean test(T t);
    boolean test2(T t);
}

看完上述內容,你們對Java8中怎么實現函數入參有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双江| 萨迦县| 科尔| 庆安县| 开原市| 黄浦区| 晋江市| 黑河市| 青海省| 云南省| 吉林市| 汉川市| 中宁县| 盖州市| 两当县| 寻乌县| 夹江县| 秦皇岛市| 沁阳市| 喀喇| 福海县| 德兴市| 蒙山县| 彭水| 黄大仙区| 都昌县| 舞阳县| 武宁县| 卫辉市| 开化县| 普陀区| 庆城县| 边坝县| 漯河市| 湟中县| 梁山县| 虹口区| 伊宁县| 内江市| 鸡泽县| 安丘市|