溫馨提示×

溫馨提示×

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

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

Java函數(shù)式斷言接口Predicate的應用方法

發(fā)布時間:2021-06-21 15:25:25 來源:億速云 閱讀:256 作者:chen 欄目:編程語言

這篇文章主要講解了“Java函數(shù)式斷言接口Predicate的應用方法”,文中的講解內(nèi)容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“Java函數(shù)式斷言接口Predicate的應用方法”吧!

最近在搞Excel導入,數(shù)據(jù)校驗是少不了的,但是不同的數(shù)據(jù)字段有不同的校驗策略,五花八門的,甚至不確定,沒有辦法使用JSR303。所以就搞一個校驗策略工具,把校驗策略抽象出來。這里嘗試了Java  8 提供的一個斷言函數(shù)接口java.util.function.Predicate,非常給力圖片!把校驗策略地封裝了起來。

Java函數(shù)式斷言接口Predicate的應用方法

Predicate接口

Predicate的應用

先來看看效果:

boolean validated = new Validator<String>()             .with(s -> s.length() > 5)             .with(s -> s.startsWith("felord"))             .with(s -> s.endsWith("cn"))             .with(s -> s.contains("."))             .validate("felord.cn");

我拿校驗字符串為例子,通過一系列的Predicate斷言來對字符串felord.cn進行校驗。這里不局限于String提供的方法,只要你滿足  String ->  boolean,也就是一個字符串入?yún)⒛艿玫揭粋€布爾返回值,都可以作為條件。例如我們在數(shù)據(jù)庫中檢索某個字符串,我們可以寫一個非常常見的UserService查詢用戶名是否存在或者有效:

public class UserServiceImpl implements UserService {     @Override     public boolean checkUserByName(String name) {         return false;     } }

對應的校驗可以改為:

UserServiceImpl userService = new UserServiceImpl();    boolean validated = new Validator<String>()            .with(s -> s.length() > 5)            .with(s -> s.startsWith("felord"))            .with(userService::checkUserByName)            .validate("felord.cn");

好奇的同學該想知道是怎么實現(xiàn)的,Validator源碼是這樣的:

import java.util.function.Predicate;   public class Validator<T> {     /**      * 初始化為 true  true &&其它布爾值時由其它布爾值決定真假      */     private Predicate<T> predicate = t -> true;      /**      * 添加一個校驗策略,可以無限續(xù)杯?      *      * @param predicate the predicate      * @return the validator      */     public Validator<T> with(Predicate<T> predicate) {         this.predicate = this.predicate.and(predicate);         return this;     }      /**      * 執(zhí)行校驗      *      * @param t the t      * @return the boolean      */     public boolean validate(T t) {         return predicate.test(t);     } }

邏輯不是很復雜,卻可以勝任各種復雜的斷言策略組合。接下來我們來對Predicate一探究竟。

Predicate

@FunctionalInterface public interface Predicate<T> {      /**      *  函數(shù)接口方法      */     boolean test(T t);      /**      * and 默認方法 相當于邏輯運算符 &&      */     default Predicate<T> and(Predicate<? super T> other) {         Objects.requireNonNull(other);         return (t) -> test(t) && other.test(t);     }      /**      * negate 默認方法 相當于邏輯運算符 !       */     default Predicate<T> negate() {         return (t) -> !test(t);     }      /**      * or 默認方法  相當于邏輯運算符 ||      */     default Predicate<T> or(Predicate<? super T> other) {         Objects.requireNonNull(other);         return (t) -> test(t) || other.test(t);     }      /**      *  這個方法是提供給{@link Objects#equals(Object, Object)}用的,不開放給開發(fā)者      */     static <T> Predicate<T> isEqual(Object targetRef) {         return (null == targetRef)                 ? Objects::isNull                 : object -> targetRef.equals(object);     } }

斷言函數(shù)接口提供了test方法供我們開發(fā)實現(xiàn),同時提供了and、negate、or分別對應Java中的邏輯運算符&&、!、||。完全滿足了布爾型變量運算,在需要多個條件策略組合時非常有用。

總結(jié)

今天通過演示了Predicate的使用,回答了曾經(jīng)一個同學到底lambda表達式和函數(shù)式編程到底如何使用的問題。函數(shù)式編程在Java的誕生,“消滅"了很多設計模式,尤其是策略模式。如果你想用好函數(shù)式編程就要加強抽象能力,多看看一些框架源碼,一定不要強行使用函數(shù)式。玩出類似下面這行代碼的笑話:

if (Objects.equals(bool,true)){          //TODO  }

感謝各位的閱讀,以上就是“Java函數(shù)式斷言接口Predicate的應用方法”的內(nèi)容了,經(jīng)過本文的學習后,相信大家對Java函數(shù)式斷言接口Predicate的應用方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細節(jié)

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

AI