日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

掌握Java函數式接口,輕松實現依賴反轉

來源: 責編: 時間:2024-06-12 08:46:40 199觀看
導讀你是否考慮過使用Java函數式接口來反轉Java項目內的依賴關系?在本文中,我們將探討如何通過使用三個關鍵接口——Supplier、Consumer和Function來實現這一目標。1. SupplierSupplier接口用于在不需要任何輸入參數的情況

你是否考慮過使用Java函數式接口來反轉Java項目內的依賴關系?在本文中,我們將探討如何通過使用三個關鍵接口——Supplier、Consumer和Function來實現這一目標。sWw28資訊網——每日最新資訊28at.com

1. Supplier

Supplier接口用于在不需要任何輸入參數的情況下提供一個對象,以下是Supplier接口的定義。sWw28資訊網——每日最新資訊28at.com

public interface Supplier{   T get();}

為了更好地理解使用這個接口的必要性,讓我們看一看下面的代碼。sWw28資訊網——每日最新資訊28at.com

public class Logger{   public void log(String message){      if(isLogEnabled()){        write(message);      }   }}// 使用Logger類public class Controller{   @Inject Logger logger;   public void execute(){      logger.log(generateLogMessage());   }}

在上面的代碼中,我們有一個Logger類負責在日志被啟用時寫入日志消息。Controller類通過調用generateLogMessage方法來向Logger類傳遞消息。到目前為止,一切看起來都很順利。sWw28資訊網——每日最新資訊28at.com

然而,試想一下,如果generateLogMessage方法涉及大量處理或消耗大量資源,而日志記錄又被禁用了,那么這些有價值的資源就白白浪費了,因為生成的日志消息不會被使用。sWw28資訊網——每日最新資訊28at.com

解決這個問題的辦法是向Logger類傳遞一個Supplier,它將在需要時返回消息,而Logger類只需在日志被啟用時調用該方法即可,代碼如下所示。sWw28資訊網——每日最新資訊28at.com

public class Logger{   public void log(Supplier messageSupplier){      if(isLogEnabled()){        write(messageSupplier.get());      }   }}// 使用Logger類public class Controller{   @Inject Logger logger;   public void execute(){      logger.log(() -> generateLogMessage());   }}

現在,generateLogMessage方法只會在Supplier的get方法被調用時執行,這樣我們就能在日志未啟用時節省資源。此外,通過使用Supplier這種解決方案,我們可以靈活地實現復雜的日志記錄邏輯,并確保它只會在需要時被調用。sWw28資訊網——每日最新資訊28at.com

2. Function

通過Function接口,可以定義一個接收參數并產生結果的函數。以下是Function接口的定義(省略了一些默認方法)。sWw28資訊網——每日最新資訊28at.com

public interface Function{   R apply(T t);}

為了開始探索Function接口,讓我們來看一個負責計算銷售訂單中商品價格的類。這個類需要接收輸入來計算最終價格,輸入包括產品、數量和適用的折扣(0到100之間)等。sWw28資訊網——每日最新資訊28at.com

public class PriceCalculator{   public BigDecimal calculatePrice(Product product,                                     Integer quantity,                                    BigDecimal discount){     var grossPrice = product.getUnitPrice()                             .multiply(BigDecimal.valueOf(quantity));     var discountAmount = grossPrice.multiply(discount)                                    .divide(BigDecimal.valueOf(100));     return grossPrice.minus(discountAmount);   }}// 使用示例var result = priceCalculator(product, 10, BigDecimal.value(10));

這個類首先計算總價,然后應用折扣,再從總價中減去折扣金額。現在,讓我們考慮一個新的需求:對價格進行貨幣轉換。sWw28資訊網——每日最新資訊28at.com

一種方法可能是直接將貨幣轉換邏輯添加到這個類中,這可能會帶來錯誤。更穩健的解決方案是引入一個負責處理貨幣轉換的Function參數。sWw28資訊網——每日最新資訊28at.com

public class PriceCalculator{   public BigDecimal calculatePrice(                        Product product,                         Integer quantity,                         BigDecimal discount,                         Function converterFunction){     var grossPrice = product.getUnitPrice()                             .multiply(BigDecimal.valueOf(quantity));     var discountAmount = grossPrice.multiply(discount)                                    .divide(BigDecimal.valueOf(100));     var netPrice = grossPrice.minus(discountAmount);     return converterFunction.apply(netPrice);   }}// 使用示例var result = priceCalculator(product,                              10,                              BigDecimal.value(10),                             netPrice -> netPrice.multiply(CURRENCY_RATE));

增加這個新需求對代碼的影響很小,我們成功地反轉了依賴關系。PriceCalculator類不再需要處理貨幣轉換;相反,它只是用提供的函數調用凈價,并返回結果。這種設計使我們能夠在不修改PriceCalculator類的情況下,使用相同的類轉換為任何貨幣。sWw28資訊網——每日最新資訊28at.com

還有其他一些方法可以滿足這個需求,而不需要修改PriceCalculator類。你可以創建另一個類,充當調用PriceCalculator的外觀,然后進行貨幣轉換。通常,采用哪種解決方案是由具體項目決定的。sWw28資訊網——每日最新資訊28at.com

3. Consumer

Consumer接口支持定義一個接收參數、執行特定任務但不返回任何值的函數。以下是Consumer接口的定義(省略了一些默認方法)。sWw28資訊網——每日最新資訊28at.com

public interface Consumer{   void accept(T t);}

為了解Consumer接口的運行示例,我們來看看這個類,它在實體中設置了一些信息,并將其保存到數據庫中。sWw28資訊網——每日最新資訊28at.com

public class EntitySaver{   public void create(Entity entity){      entity.setCreationDate(new Date());      database.insert(entity);   }}// 使用示例entitySaver.create(entity);

現在,假設我們需要在創建實體時通知其他類,但我們無法修改create方法的接口。在這種情況下,我們可以使用Consumer接口來實現發布-訂閱模式,下面是我們實現該模式的方法。sWw28資訊網——每日最新資訊28at.com

public class EntitySaver{   private List> consumerList = new ArrayList<>();   public void register(Consumer consumer){      consumerList.add(consumer);   }   public void create(Entity entity){      entity.setCreationDate(new Date());      database.insert(entity);      consumerList.forEach(consumer -> consumer.accept(entity));   }}// 使用示例entitySaver.register(entity -> log.info(entity));entitySaver.register(entity -> mailerService.notifyUser(entity));entitySaver.create(entity);

在這個發布-訂閱模式的實現中,我們使用了Consumer接口。EntitySaver類現在維護了一個消費者列表,并包含了一個register方法來添加消費者到這個列表中。雖然create方法的接口保持不變,但我們引入了一行代碼來“消費”創建的實體,方法是調用已注冊的消費者。sWw28資訊網——每日最新資訊28at.com

4. 結語

Java函數式接口是多年前引入的,它們對我們開發Java的方式產生了很大的影響。我們可以將它們用作lambda函數,也可以用來反轉依賴關系,使我們的代碼更加簡潔。sWw28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-93210-0.html掌握Java函數式接口,輕松實現依賴反轉

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: C# 實現動態訪問 WebService,兼容 .NET Framework 和 .NET Core

下一篇: 七種 JavaScript 中位運算符的神奇用法

標簽:
  • 熱門焦點
  • 十個可以手動編寫的 JavaScript 數組 API

    JavaScript 中有很多API,使用得當,會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進行一次小總結。現在開始吧。1.forEach()forEach()用于遍歷數組接收一參
  • Java NIO內存映射文件:提高文件讀寫效率的優秀實踐!

    Java的NIO庫提供了內存映射文件的支持,它可以將文件映射到內存中,從而可以更快地讀取和寫入文件數據。本文將對Java內存映射文件進行詳細的介紹和演示。內存映射文件概述內存
  • 這款新興工具平臺,讓你的電腦效率翻倍

    隨著信息技術的發展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個瓶頸。于是各種工具應運而生,都在爭相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • 2023年,我眼中的字節跳動

    此時此刻(2023年7月),字節跳動從未上市,也從未公布過任何官方的上市計劃;但是這并不妨礙它成為中國最受關注的互聯網公司之一。從2016-17年的抖音強勢崛起,到2018年的&ldquo;頭騰
  • 騰訊蓋樓,字節拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 認真聊聊東方甄選:如何告別低垂的果實

    來源:山核桃作者:財經無忌爆火一年后,俞敏洪和他的東方甄選依舊是頗受外界關心的&ldquo;網紅&rdquo;。7月5日至9日,為期5天的東方甄選&ldquo;甘肅行&rdquo;首次在自有App內直播,
  • iQOO Neo8 Pro評測:旗艦雙芯加持 最強性能游戲旗艦

    【Techweb評測】去年10月,iQOO推出了一款Neo7手機,該機搭載了聯發科天璣9000+,配備獨顯芯片Pro+,帶來了同價位段最佳的游戲體驗,一經上市便受到了諸多用
  • DRAM存儲器10月價格下跌,NAND閃存本月價格與上月持平

    10月30日,據韓國媒體消息,自今年年初以來一直在上漲的 DRAM 存儲器的交易價格僅在本月就下跌了近 10%,此次是全年首次降價,而NAND 閃存本月價格與上月持平。市
  • onebot M24巧系列一體機采用輕薄機身設計,現已在各平臺開售

    onebot M24 巧系列一體機目前已在線上線下各平臺同步開售。onebot M24 巧系列采用一體化輕薄機身設計,最薄處為 10.15mm,擁有寶石紅、午夜藍、石墨綠、雅致
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
久久在精品线影院精品国产| 一本久道久久久| 欧美午夜寂寞影院| 国产精品成人一区二区艾草| 国产精品影片在线观看| 激情久久久久久| 91久久精品日日躁夜夜躁欧美| 亚洲精品黄网在线观看| 亚洲午夜电影网| 久久精品夜色噜噜亚洲aⅴ| 免费观看一级特黄欧美大片| 欧美日韩国产一区| 国产精品三级视频| 伊人久久大香线| 日韩亚洲精品视频| 亚洲欧美另类在线| 美女啪啪无遮挡免费久久网站| 欧美欧美天天天天操| 国产精品综合av一区二区国产馆| 在线播放中文字幕一区| 一区二区欧美亚洲| 久久久久久成人| 欧美婷婷在线| 在线看欧美视频| 亚洲国产精品综合| 亚洲欧美久久久| 欧美a级大片| 国产乱码精品| 亚洲伦理网站| 久久久久国产精品www| 久久亚洲国产精品日日av夜夜| 欧美日韩亚洲综合| 精品电影一区| 亚洲欧美日韩精品久久亚洲区| 免费在线成人av| 国产精品家庭影院| 亚洲精华国产欧美| 欧美亚洲综合在线| 欧美日韩视频不卡| 在线免费观看日韩欧美| 午夜精品久久久久久久久久久久久| 欧美大片免费| 国产综合色一区二区三区 | 伊人成人开心激情综合网| 亚洲一区二区三区乱码aⅴ| 模特精品裸拍一区| 国产一区二区精品丝袜| 中日韩午夜理伦电影免费| 久久综合亚洲社区| 国产亚洲精品综合一区91| 在线亚洲免费视频| 欧美激情一二三区| 在线看成人片| 久久不射中文字幕| 国产精品入口福利| 99天天综合性| 欧美国产日本韩| 精品福利电影| 久久成人人人人精品欧| 国产精品久久久久久av下载红粉| 亚洲人成网站999久久久综合| 久久久精品欧美丰满| 国产精品久久久久影院色老大| 亚洲精品国产精品国自产在线 | 亚洲国产成人精品女人久久久| 香蕉乱码成人久久天堂爱免费| 欧美日韩一区二区高清| 亚洲欧洲在线观看| 美女免费视频一区| 伊人蜜桃色噜噜激情综合| 亚洲一区二区在线免费观看视频| 欧美日韩hd| 亚洲精品视频免费| 欧美成人首页| 亚洲韩国精品一区| 另类图片国产| 亚洲第一区中文99精品| 久久女同精品一区二区| 韩国三级在线一区| 久久精品中文字幕一区二区三区| 国产农村妇女精品一区二区| 亚洲综合第一页| 国产精品进线69影院| 亚洲视频第一页| 国产精品videosex极品| 亚洲香蕉在线观看| 国产精品第一页第二页第三页| 这里只有精品丝袜| 国产精品国产三级国产aⅴ入口| av不卡在线观看| 欧美午夜性色大片在线观看| 亚洲色图在线视频| 国产精品国产一区二区| 亚洲中无吗在线| 国产精品亚洲人在线观看| 午夜精品福利一区二区三区av| 国产日本欧洲亚洲| 久久精品99无色码中文字幕| 黄色亚洲免费| 免费亚洲网站| 在线免费不卡视频| 欧美成人精品一区| 日韩视频在线你懂得| 欧美日韩一区在线视频| 亚洲国产美女精品久久久久∴| 欧美精品成人91久久久久久久| 亚洲伦理久久| 国产精品视频在线观看| 久久精品国产欧美激情| 在线观看欧美亚洲| 欧美日韩天天操| 欧美在线一区二区| 亚洲国产三级网| 国产精品成av人在线视午夜片| 先锋影音国产一区| 亚洲高清电影| 欧美日韩日本网| 欧美在线播放一区| 亚洲激情综合| 国产精品嫩草99a| 久久午夜av| av成人免费在线观看| 国产日韩一区| 欧美国产精品v| 午夜精品久久久久久久蜜桃app | 亚洲高清资源| 欧美日韩在线视频一区二区| 欧美影院精品一区| 亚洲日本免费| 国产精品无码永久免费888| 久久精品国产精品亚洲| 亚洲人成欧美中文字幕| 欧美系列电影免费观看| 久久精品一区| 亚洲美女啪啪| 欧美性大战久久久久| 久久久成人精品| 亚洲人午夜精品| 欧美性理论片在线观看片免费| 夜夜爽99久久国产综合精品女不卡| 国产欧美日韩亚洲| 男人的天堂亚洲在线| 一本色道久久88综合日韩精品 | 99v久久综合狠狠综合久久| 欧美性猛交视频| 欧美在线www| 亚洲国产精品999| 国产日产精品一区二区三区四区的观看方式 | 亚洲激情婷婷| 欧美午夜免费电影| 麻豆精品传媒视频| 中国女人久久久| 国语自产在线不卡| 欧美日韩精品久久久| 亚洲一区二区三区四区中文 | 国产亚洲电影| 欧美精品成人| 老巨人导航500精品| 宅男在线国产精品| 黑人巨大精品欧美一区二区小视频| 欧美国产一区二区| 亚洲伊人观看| 亚洲精品中文字幕女同| 国产欧美精品va在线观看| 欧美aⅴ一区二区三区视频| 亚洲免费视频成人| 影音先锋久久资源网| 国产欧美日韩免费| 欧美精品aa| 久久久伊人欧美| 一区二区三欧美| 精品999成人| 国产精品制服诱惑| 欧美精品二区三区四区免费看视频| 午夜精品视频网站| 在线观看视频欧美| 国内精品亚洲| 国产精品视频免费观看www| 欧美激情第10页| 久久久久在线观看| 久久精品日产第一区二区| 亚洲午夜激情网站| 亚洲精品在线观看免费| 国产中文一区二区| 欧美日一区二区在线观看 | 在线看欧美视频| 国产欧美日韩综合精品二区| 欧美99久久| 免费短视频成人日韩| 欧美一区二区三区啪啪| 一本色道久久88精品综合| 久久精品二区| 亚洲专区在线视频| 亚洲每日更新| 亚洲第一久久影院| 国产一区清纯| 国产精品成人观看视频免费| 欧美日韩一区二区三区在线观看免| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲黄网站在线观看| 韩国av一区二区三区四区| 国产精品美女久久久浪潮软件 | 国模精品娜娜一二三区| 国产精品视频一二|