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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java 7.函数-递归_带有谓词的Java中的函数样式-第1部分

發布時間:2023/12/3 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java 7.函数-递归_带有谓词的Java中的函数样式-第1部分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java 7.函數-遞歸

您一直在聽到將要席卷全球的函數式編程,而您仍然堅持使用普通Java? 不用擔心,因為您已經可以在日常Java中添加一些功能樣式。 此外,它很有趣,可以節省許多代碼行并減少錯誤。

什么是謂詞?

實際上,當我很早以前在Java 1.4中進行編碼時,我第一次發現Apache Commons Collections時就愛上了謂詞。 該API中的謂詞不過是Java界面,僅包含一種方法:

evaluate(Object object): boolean

就是這樣,它只需要一些對象并返回true或false。 帶有Apache License 2.0的Google Guava是Apache Commons Collections的更新版本。 它使用通用參數通過一種方法定義了謂詞接口:

apply(T input): boolean

就這么簡單。 要在應用程序中使用謂詞,您只需在自己的單個方法apply(something)中使用您自己的邏輯來實現此接口。 ?

一個簡單的例子

作為早期的示例,假設您有一個PurchaseOrder對象的列表訂單 ,每個訂單都有一個日期,一個Customer和一個州。 各種用例可能會要求您找出該客戶的每個訂單,每個待處理,已發貨或已交付的訂單,或者自上一小時以來完成的每個訂單。 當然,您可以通過foreach循環和if內部循環來實現:

//List<PurchaseOrder> orders...public List<PurchaseOrder> listOrdersByCustomer(Customer customer) {final List<PurchaseOrder> selection = new ArrayList<PurchaseOrder>();for (PurchaseOrder order : orders) {if (order.getCustomer().equals(customer)) {selection.add(order);}}return selection; }

再次針對每種情況:

public List<PurchaseOrder> listRecentOrders(Date fromDate) {final List<PurchaseOrder> selection = new ArrayList<PurchaseOrder>();for (PurchaseOrder order : orders) {if (order.getDate().after(fromDate)) {selection.add(order);}}return selection; }

重復非常明顯:除了if子句中的條件(此處以黑體強調)之外,每個方法都是相同的。 使用謂詞的想法只是通過調用謂詞來代替if子句中的硬編碼條件,然后調用謂詞。 這意味著您只能編寫一個方法,將謂詞作為參數,并且仍然可以覆蓋所有用例,甚至已經支持了您尚不知道的用例:

public List<PurchaseOrder> listOrders(Predicate<PurchaseOrder> condition ) {final List<PurchaseOrder> selection = new ArrayList<PurchaseOrder>();for (PurchaseOrder order : orders) {if (condition.apply(order)) {selection.add(order);}}return selection; }

每個謂詞可以在多個地方使用時定義為獨立類,也可以定義為匿名類:

final Customer customer = new Customer("BruceWaineCorp"); final Predicate<PurchaseOrder> condition = new Predicate<PurchaseOrder>() {public boolean apply(PurchaseOrder order) {return order.getCustomer().equals(customer);} };

使用真正的函數式編程語言(Scala,Clojure,Haskell等)的朋友會評論說,上面的代碼非常冗長,無法完成某些非常常見的事情,我必須同意。 但是,我們已經習慣了Java語法中的冗長性,并且我們擁有功能強大的工具(自動完成,重構)來適應它。 而且我們的項目可能無法在一夜之間切換到另一種語法。 ?

謂詞是收藏最好的朋友

回到我們的示例,我們只編寫了一次foreach循環來覆蓋每個用例,我們對此表示滿意。 但是,您的朋友“真正地”進行函數式編程仍然可以嘲笑您必須自己編寫的循環。 幸運的是,來自Apache或Google的API也都提供了您可能期望的所有優點,特別是類似于java.util.Collections的類,因此命名為Collections2 (不是一個非常原始的名稱)。

此類提供了一個方法filter() ,它的功能類似于我們之前編寫的內容,因此我們現在可以完全不使用循環來重寫方法:

public Collection<PurchaseOrder> selectOrders(Predicate<PurchaseOrder> condition) {return Collections2.filter(orders, condition); }

實際上,此方法返回一個篩選視圖:

返回的集合是unfiltered的實時視圖(輸入集合); 改變一個會影響另一個。

這也意味著更少的內存使用,因為是從未經過濾的 過濾 ,以實際返回的集合初始收集沒有實際的副本。

在類似的方法上,給定一個迭代器,您可以在它之上請求一個經過過濾的迭代器(Decorator模式),該迭代器僅為您提供謂詞選擇的元素:

Iterator filteredIterator = Iterators.filter(unfilteredIterator, condition);

由于Java 5的Iterable接口在foreach循環中非常方便使用,因此我們更愿意使用以下表達式:

public Iterable<PurchaseOrder> selectOrders(Predicate<PurchaseOrder> condition) {return Iterables.filter(orders, condition); }// you can directly use it in a foreach loop, and it reads well: for (PurchaseOrder order : orders.selectOrders(condition)) {//... }

現成的謂詞

要使用謂詞,您可以簡單地定義自己的接口謂詞,或者為應用程序中需要的每個類型參數定義一個。 這是可能的,但是使用來自諸如Guava或Commons Collections之類的API的標準謂詞接口的好處是,API帶來了許多出色的構建塊,可與您自己的謂詞實現結合使用。

首先,您甚至根本不需要實現自己的謂詞。 如果您所需要的只是一個對象是否等于另一個條件或不為空的條件,那么您可以簡單地要求謂詞:

// gives you a predicate that checks if an integer is zero Predicate<Integer> isZero = Predicates.equalTo(0); // gives a predicate that checks for non null objects Predicate<String> isNotNull = Predicates.notNull(); // gives a predicate that checks for objects that are instanceof the given Class Predicate<Object> isString = Predicates.instanceOf(String.class);

給定一個謂詞,您可以將其求逆(true變為false,反之亦然):

Predicates.not(predicate);

使用布爾運算符AND或OR組合多個謂詞:

Predicates.and(predicate1, predicate2); Predicates.or(predicate1, predicate2); // gives you a predicate that checks for either zero or null Predicate<Integer> isNullOrZero = Predicates.or(isZero, Predicates.isNull());

當然,您還具有總是返回true或false的特殊謂詞,它們確實非常有用,我們將在以后的測試中看到:

Predicates.alwaysTrue(); Predicates.alwaysFalse();

謂詞在哪里

我經常經常一開始會做匿名謂詞,但是它們總是經常被使用,因此經常被提升為實際的類,無論是否嵌套。

順便說一下,這些謂詞在哪里定位? 遵循羅伯特·馬丁( Robert C. Martin) 及其共同封閉原則(CCP) :

一起變化的類,一起屬于

因為謂詞操縱某種類型的對象,所以我喜歡將它們共置為靠近它們作為參數的類型。 例如, CustomerOrderPredicate , PendingOrderPredicate和RecentOrderPredicate類應與它們評估的PurchaseOrder類駐留在同一包中,或者如果它們很多,則位于子包中。 另一個選擇是將它們嵌套在類型本身內。 顯然,謂詞與它們所操作的對象非常相關。

資源資源

以下是本文示例的源文件: cyriux_predicates_part1 (zip)

在下一部分中 ,我們將了解謂詞如何簡化測試,它們如何與域驅動設計中的規范相關聯,以及一些其他方面的知識,以使您的謂詞發揮最大作用。

參考: 帶有謂詞的純Java語言中的函數式風格– Cyrille Martraire博客博客中JCG合作伙伴 Cyrille Martraire的第1部分 。


翻譯自: https://www.javacodegeeks.com/2012/05/functional-style-in-java-with.html

java 7.函數-遞歸

總結

以上是生活随笔為你收集整理的java 7.函数-递归_带有谓词的Java中的函数样式-第1部分的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 黄色.com | 日日爽日日操 | 在线观看免费观看在线 | 福利二区视频 | 中国女人内谢69xxxxⅹ视频 | 美女av免费观看 | av免费看片 | 黄色裸体片 | 办公室荡乳欲伦交换bd电影 | 18禁一区二区 | tube国产麻豆| 中国毛片视频 | 精品国产区一区二 | 视频一区二区视频 | 双腿张开被9个男人调教 | 国产天天骚 | 五月天在线播放 | 丰满岳乱妇国产精品一区 | 手机在线看永久av片免费 | 成人国产精品免费观看动漫 | 天堂网男人| 无遮挡av| 欧美xxxxx高潮喷水麻豆 | 伊人激情视频 | 欧美日韩观看 | 久久国产精品毛片 | 亚洲av综合色区无码二区爱av | 欧美黄色录像 | 欧美熟妇精品黑人巨大一二三区 | 精品欧美一区二区精品少妇 | 亚洲天堂福利视频 | 桃谷绘里香在线播放 | 日韩成人短视频 | 欧美区在线 | 久久亚洲私人国产精品va | 99精品视频免费 | 国产你懂的 | 午夜亚洲AV永久无码精品蜜芽 | 91日韩 | 午夜av免费 | 在线观看黄色片网站 | www色| 白浆在线 | 国产又大又粗又爽的毛片 | 青青草国产在线视频 | 欧洲精品一区二区三区 | 亚洲人成网站999久久久综合 | 好爽…又高潮了毛片免费看 | 少妇高潮迭起 | 丝袜综合网 | 成人乱码一区二区三区av | 熟女少妇一区二区 | 中文字幕一级二级三级 | 午夜影院一区二区 | 婷婷深爱五月 | 18岁禁黄网站 | 精品一区二区在线免费观看 | 性高湖久久久久久久久aaaaa | 涩涩涩在线观看 | 欧美福利视频 | 天堂影音 | 日本黄色免费网站 | 中国黄色一级毛片 | 免费人成视频在线播放 | sm调教羞耻姿势图片 | 三级性视频 | 美女考逼| 毛片在线播放视频 | av小说在线| 在线观看理论片 | 伊人青青草视频 | 天天摸夜夜操 | 九色视频国产 | 999一区二区三区 | 最近的中文字幕 | 国产成人免费网站 | 91av入口| 69日本xxxxxxxxx30 在线波多野结衣 | 中国少妇初尝黑人巨大 | 亚洲激情久久久 | 精品一区二区三区免费毛片爱 | 淫欲少妇| 在线免费黄网 | 在线观看aaa | 国产一二精品 | 青青草国产在线观看 | 亚洲色图一区二区三区 | 精品国产乱码久久久久夜深人妻 | 秋霞欧美一区二区三区视频免费 | 中文字幕+乱码+中文乱码www | 欧美一区二区三区成人片在线 | 久久伊人婷婷 | 东北少妇bbbb搡bbb搡 | 性一交一乱一区二区洋洋av | 欧美性猛交性大交 | 免费看黄视频的网站 | 阿v天堂在线观看 | aaaa毛片| 日本精品久久久久久 |