最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中Consumer與Supplier接口的使用及區(qū)別小結(jié)

 更新時(shí)間:2025年11月07日 08:33:45   作者:往事隨風(fēng)去  
Consumer和Supplier是Java8引入的兩個(gè)函數(shù)式接口,Consumer用于消費(fèi)數(shù)據(jù),Supplier用于提供數(shù)據(jù),兩者都是函數(shù)式接口,本文就來(lái)介紹一下Java中Consumer與Supplier接口的使用及區(qū)別小結(jié),感興趣的可以了解一下

異同分析

Consumer 和 Supplier 是 Java 8 引入的兩個(gè)重要函數(shù)式接口,位于 java.util.function 包中,用于支持函數(shù)式編程范式。

相同點(diǎn)

  1. 都是函數(shù)式接口(只有一個(gè)抽象方法)
  2. 都位于 java.util.function 包中
  3. 都用于 Lambda 表達(dá)式和方法引用
  4. 都在 Stream API 和 Optional 類中廣泛使用

不同點(diǎn)

特性ConsumerSupplier
方法簽名void accept(T t)T get()
參數(shù)接受一個(gè)輸入?yún)?shù)無(wú)輸入?yún)?shù)
返回值無(wú)返回值返回一個(gè)值
主要用途消費(fèi)數(shù)據(jù)提供數(shù)據(jù)
類比方法中的參數(shù)方法中的返回值

詳細(xì)分析與使用場(chǎng)景

Consumer 接口

Consumer 表示接受單個(gè)輸入?yún)?shù)但不返回結(jié)果的操作。

import java.util.function.Consumer;
import java.util.Arrays;
import java.util.List;

public class ConsumerExample {
    public static void main(String[] args) {
        // 基本用法
        Consumer<String> printConsumer = s -> System.out.println(s);
        printConsumer.accept("Hello Consumer!");
        
        // 方法引用方式
        Consumer<String> methodRefConsumer = System.out::println;
        methodRefConsumer.accept("Hello Method Reference!");
        
        // 集合遍歷中的應(yīng)用
        List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
        names.forEach(printConsumer);
        
        // andThen 方法組合多個(gè) Consumer
        Consumer<String> upperCaseConsumer = s -> System.out.println(s.toUpperCase());
        Consumer<String> decoratedConsumer = s -> System.out.println("*** " + s + " ***");
        
        Consumer<String> combinedConsumer = upperCaseConsumer.andThen(decoratedConsumer);
        combinedConsumer.accept("functional interface");
        
        // 在 Optional 中的使用
        java.util.Optional<String> optional = java.util.Optional.of("Present");
        optional.ifPresent(combinedConsumer);
    }
}

Consumer 的使用場(chǎng)景

  1. 遍歷集合元素并執(zhí)行操作
  2. 處理數(shù)據(jù)并產(chǎn)生副作用(如打印、保存到數(shù)據(jù)庫(kù))
  3. 在 Optional 中處理可能存在的值
  4. 組合多個(gè)操作形成處理鏈

Supplier 接口

Supplier 表示一個(gè)供應(yīng)商,不需要傳入?yún)?shù)但返回一個(gè)值。

import java.util.function.Supplier;
import java.util.List;
import java.util.Random;
import java.util.stream.Stream;

public class SupplierExample {
    public static void main(String[] args) {
        // 基本用法
        Supplier<String> stringSupplier = () -> "Hello from Supplier!";
        System.out.println(stringSupplier.get());
        
        // 方法引用方式
        Supplier<Double> randomSupplier = Math::random;
        System.out.println("Random number: " + randomSupplier.get());
        
        // 對(duì)象工廠
        Supplier<List<String>> listSupplier = () -> java.util.Arrays.asList("A", "B", "C");
        System.out.println("List from supplier: " + listSupplier.get());
        
        // 延遲計(jì)算/初始化
        Supplier<ExpensiveObject> expensiveObjectSupplier = () -> {
            System.out.println("Creating expensive object...");
            return new ExpensiveObject();
        };
        
        System.out.println("Supplier created but no object yet...");
        // 只有在調(diào)用 get() 時(shí)才會(huì)創(chuàng)建對(duì)象
        ExpensiveObject obj = expensiveObjectSupplier.get();
        
        // 在 Stream 中生成無(wú)限流
        Supplier<Integer> randomIntSupplier = () -> new Random().nextInt(100);
        Stream.generate(randomIntSupplier)
              .limit(5)
              .forEach(System.out::println);
              
        // 在 Optional 中作為備選值
        java.util.Optional<String> emptyOptional = java.util.Optional.empty();
        String value = emptyOptional.orElseGet(() -> "Default from supplier");
        System.out.println("Value from empty optional: " + value);
    }
    
    static class ExpensiveObject {
        ExpensiveObject() {
            // 模擬耗時(shí)操作
            try { Thread.sleep(1000); } catch (InterruptedException e) {}
        }
    }
}

Supplier 的使用場(chǎng)景

  1. 延遲初始化或延遲計(jì)算
  2. 提供配置或默認(rèn)值
  3. 生成測(cè)試數(shù)據(jù)或模擬對(duì)象
  4. 在 Optional 中提供備選值
  5. 創(chuàng)建對(duì)象工廠
  6. 實(shí)現(xiàn)惰性求值模式

實(shí)際應(yīng)用示例

下面是一個(gè)結(jié)合使用 Consumer 和 Supplier 的示例:

import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.logging.Logger;

public class CombinedExample {
    private static final Logger logger = Logger.getLogger(CombinedExample.class.getName());
    
    public static void main(String[] args) {
        // 創(chuàng)建一個(gè)數(shù)據(jù)處理器,結(jié)合了 Supplier 和 Consumer
        processData(
            () -> { // Supplier - 提供數(shù)據(jù)
                // 模擬從數(shù)據(jù)庫(kù)或API獲取數(shù)據(jù)
                return new String[] {"Data1", "Data2", "Data3"};
            },
            data -> { // Consumer - 處理數(shù)據(jù)
                for (String item : data) {
                    System.out.println("Processing: " + item);
                }
            },
            error -> { // Consumer - 錯(cuò)誤處理
                logger.severe("Error occurred: " + error.getMessage());
            }
        );
    }
    
    public static <T> void processData(Supplier<T> dataSupplier, 
                                      Consumer<T> dataProcessor, 
                                      Consumer<Exception> errorHandler) {
        try {
            T data = dataSupplier.get(); // 從Supplier獲取數(shù)據(jù)
            dataProcessor.accept(data);  // 用Consumer處理數(shù)據(jù)
        } catch (Exception e) {
            errorHandler.accept(e);      // 用Consumer處理錯(cuò)誤
        }
    }
}

總結(jié)

  • Consumer 用于表示接受輸入并執(zhí)行操作但不返回結(jié)果的函數(shù),常見(jiàn)于需要處理數(shù)據(jù)并產(chǎn)生副作用的場(chǎng)景
  • Supplier 用于表示無(wú)需輸入但返回結(jié)果的函數(shù),常見(jiàn)于延遲計(jì)算、提供數(shù)據(jù)和工廠模式場(chǎng)景
  • 兩者都是函數(shù)式編程中的重要構(gòu)建塊,可以組合使用創(chuàng)建靈活的數(shù)據(jù)處理管道
  • 在 Stream API、Optional 和現(xiàn)代 Java 框架中廣泛應(yīng)用

理解這兩個(gè)接口的差異和適用場(chǎng)景有助于編寫更簡(jiǎn)潔、更表達(dá)力的 Java 代碼,特別是在使用 Stream API 和函數(shù)式編程范式時(shí)。

到此這篇關(guān)于Java中Consumer與Supplier接口的使用及區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)Java Consumer與Supplier接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Mybatis Plus Join使用方法示例詳解

    Mybatis Plus Join使用方法示例詳解

    這篇文章主要介紹了Mybatis Plus Join使用方法示例詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友一起看看吧
    2025-06-06
  • Effective Java (異常處理)

    Effective Java (異常處理)

    Effective Java (異常處理),需要的朋友可以參考一下
    2013-02-02
  • 解決idea update project 更新選項(xiàng)消失的問(wèn)題

    解決idea update project 更新選項(xiàng)消失的問(wèn)題

    這篇文章主要介紹了解決idea update project 更新選項(xiàng)消失的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • Java數(shù)組添加元素實(shí)例

    Java數(shù)組添加元素實(shí)例

    這篇文章主要介紹了Java數(shù)組添加元素實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 5分鐘搞懂java注解@Annotation的具體使用

    5分鐘搞懂java注解@Annotation的具體使用

    這篇文章主要介紹了5分鐘搞懂java注解@Annotation的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • 解決mybatis執(zhí)行SQL語(yǔ)句部分參數(shù)返回NULL問(wèn)題

    解決mybatis執(zhí)行SQL語(yǔ)句部分參數(shù)返回NULL問(wèn)題

    這篇文章主要介紹了mybatis執(zhí)行SQL語(yǔ)句部分參數(shù)返回NULL問(wèn)題,需要的的朋友參考下吧
    2017-06-06
  • 深入了解Java atomic原子類的使用方法和原理

    深入了解Java atomic原子類的使用方法和原理

    這篇文章主要介紹了深入了解Java atomic原子類的使用方法和原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • springmvc的文件保存方法詳解

    springmvc的文件保存方法詳解

    這篇文章主要介紹了springmvc的文件保存方法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java利用Spire.Doc實(shí)現(xiàn)RTF轉(zhuǎn)換PDF的高效方案

    Java利用Spire.Doc實(shí)現(xiàn)RTF轉(zhuǎn)換PDF的高效方案

    在企業(yè)級(jí)應(yīng)用開發(fā)中,RTF格式雖因其良好的兼容性曾在文檔交換領(lǐng)域占據(jù)一席之地,但隨著移動(dòng)辦公和長(zhǎng)期歸檔需求的增加,其跨平臺(tái)顯示不一致、易被篡改的弊端日益凸顯,本文將介紹如何利用Spire.Doc for Java這一強(qiáng)大的類庫(kù)實(shí)現(xiàn)將RTF轉(zhuǎn)換為PDF,需要的朋友可以參考下
    2026-03-03
  • Java刪除String中指定字符的11種方法匯總

    Java刪除String中指定字符的11種方法匯總

    這篇文章主要給大家介紹了關(guān)于Java刪除String中指定字符的11種方法,在Java中String類提供了許多方法來(lái)處理字符串,其中包括刪除指定字符的方法,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11

最新評(píng)論

上思县| 体育| 包头市| 漾濞| 元氏县| 澎湖县| 封丘县| 保靖县| 昆明市| 商洛市| 广平县| 永州市| 益阳市| 文安县| 兴宁市| 定州市| 宿松县| 宿迁市| 芒康县| 祁连县| 文昌市| 平泉县| 札达县| 股票| 德昌县| 桓台县| 定州市| 安多县| 甘谷县| 青海省| 德钦县| 萨嘎县| 西乌| 西乌| 通道| 沁阳市| 阿城市| 阿荣旗| 贺兰县| 华安县| 丰台区|