日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

先发帖

發(fā)布時間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 先发帖 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

通常,我們編寫代碼來計算出一堆可用的答案。 讓我們看看Java中的情況。

public Widget getAppropriateWidget(CustomerRequest request) { if (shelfstock.contains(request.getBarcode()) { return new ShelfWidget(); } if (backroomStock.contains(request.getBarcode()) { return new BackroomWidget(); } if (supplier.contains(request.getEan()) { return new SupplierWidget(); } return null ; }

您將不得不想象更復雜的場景,隱藏在上面的簡化代碼后面。 該算法的作用是按優(yōu)先級順序嘗試選項,直到找到有效的選項,否則將失敗,在這種情況下它將不返回任何內容。

我們還要想象一下,由于某些原因,對contains的調用很昂貴–也許每個對象都隱藏了一個Web服務或復雜的數(shù)據(jù)庫查詢。

讓我們以兩種方式重構上面的代碼開始。 讓我們使用Optional ,并為每個方法使用子例程。

public Optional<Widget> getAppropriateWidget(CustomerRequest request) { Optional<Widget> shelfWidget = getShelfWidget(request); if (shelfWidget.isPresent()) { return shelfWidget; } Optional<Widget> backroomWidget = getBackroomWidget(request); if (backroomWidget.isPresent()) { return backroomWidget; } Optional<Widget> supplierWidget = getSupplierWidget(request); if (supplierWidget.isPresent()) { return supplierWidget; } return Optional.empty; } // imagine the subsidiary functions

因此,這比未找到的返回null要好于null ,并且正努力使用子例程來使該函數(shù)描述自身,但是存在這樣一個問題,即返回的每個Optional對象都無法鏈接到責任鏈。

我們可以作弊:

Optional<Widget> shelfWidget = getShelfWidget(request); Optional<Widget> backroomWidget = getBackroomWidget(request); Optional<Widget> supplierWidget = getSupplierWidget(request); return firstNonEmpty(shelfWidget, backroomWidget, supplierWidget); private static Optional<Widget> firstNonEmpty( Optional<Widget> ... options) { return Arrays.stream(options) .filter(Optional::isPresent) .findFirst() // makes an optional of optional here... .orElse(Optional.empty()); }

上面的代碼更好一些,但是現(xiàn)在必須在選擇一個之前預先計算所有可能的答案。 如果答案很快就會出現(xiàn),我們就需要避免成本高昂的期權計算。

帶有可選解決方案的第一個過去的帖子

將流或varargs數(shù)組傳遞給一個函數(shù),該函數(shù)由將提供可選參數(shù)的對象組成。 如果它們中的任何一個提供非空值,則獲勝。

// calling code public Optional<Widget> getAppropriateWidget(CustomerRequest request) { return firstAvailable(() -> getShelfWidget(request), () -> getBackroomWidget(request), () -> getSupplierWidget(request)); } // this is a general purpose solution // feel free to use it @SafeVarargs private static <T> Optional<T> firstAvailable( Supplier<Optional<T>> ... options) { return Arrays.stream(options) .map(Supplier::get) .filter(Optional::isPresent) .findFirst() .orElse(Optional.empty()); }

翻譯自: https://www.javacodegeeks.com/2019/11/first-past-the-post.html

總結

以上是生活随笔為你收集整理的先发帖的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。