国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java8-6-Predicate接口詳解

Joyven / 3387人閱讀

摘要:上一篇我們學(xué)習(xí)了和函數(shù)式接口,本篇繼續(xù)了解下其他常用的函數(shù)式接口。方法同樣接收一個類型,將傳入的條件和當前的條件以或者的關(guān)系過濾數(shù)據(jù)。就是將當前條件取反。而返回的這個函數(shù)式接口實例是通過傳入的的方法進行判斷的。

上一篇我們學(xué)習(xí)了Function和BiFunction函數(shù)式接口,本篇繼續(xù)了解下其他常用的函數(shù)式接口。
先來看下Predicate
Predicate函數(shù)式接口的主要作用就是提供一個test方法,接受一個參數(shù)返回一個布爾類型,Predicate在stream api中進行一些判斷的時候非常常用。

@FunctionalInterface
public interface Predicate {

    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);
}

使用泛型T指定傳入的參數(shù)類型,我們通過一個根據(jù)不同條件取出不同數(shù)據(jù)的例子來看下Predicate具體應(yīng)用

public class PredicateTest {
    public static void main(String[] args) {
        List list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        PredicateTest predicateTest = new PredicateTest();
        //輸出大于5的數(shù)字
        List result = predicateTest.conditionFilter(list, integer -> integer > 5);
        result.forEach(System.out::println);
        System.out.println("-------");
        //輸出大于等于5的數(shù)字
        result = predicateTest.conditionFilter(list, integer -> integer >= 5);
        result.forEach(System.out::println);
        System.out.println("-------");
        //輸出小于8的數(shù)字
        result = predicateTest.conditionFilter(list, integer -> integer < 8);
        result.forEach(System.out::println);
        System.out.println("-------");
        //輸出所有數(shù)字
        result = predicateTest.conditionFilter(list, integer -> true);
        result.forEach(System.out::println);
        System.out.println("-------");
    }
    //高度抽象的方法定義,復(fù)用性高
    public List conditionFilter(List list, Predicate predicate){
        return list.stream().filter(predicate).collect(Collectors.toList());
    }
}

我們只定義了一個conditionFilter方法,stream()會將當前l(fā)ist作為源創(chuàng)建一個Stream對象,collect(Collectors.toList())是將最終的結(jié)果封裝在ArrayList中(這部分會在后續(xù)stream學(xué)習(xí)中詳細介紹,這里只關(guān)注filter即可),filter方法接收一個Predicate類型參數(shù)用于對目標集合進行過濾。里面并沒有任何具體的邏輯,提供了一種更高層次的抽象化,我們可以把要處理的數(shù)據(jù)和具體的邏輯通過參數(shù)傳遞給conditionFilter即可。理解了這種設(shè)計思想后,再看上面的例子就很容易理解,本身邏輯并不復(fù)雜,分別取出小于5、大于等于5、小于8的元素,最后一個總是返回true的條件意味著打印出集合中所有元素。
除此之外,Predicate還提供了另外三個默認方法和一個靜態(tài)方法

default Predicate and(Predicate other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) && other.test(t);
}

default Predicate or(Predicate other) {
    Objects.requireNonNull(other);
    return (t) -> test(t) || other.test(t);
}

default Predicate negate() {
    return (t) -> !test(t);
}

static  Predicate isEqual(Object targetRef) {
    return (null == targetRef)
            ? Objects::isNull
            : object -> targetRef.equals(object);
}

and方法接收一個Predicate類型,也就是將傳入的條件和當前條件以并且的關(guān)系過濾數(shù)據(jù)。or方法同樣接收一個Predicate類型,將傳入的條件和當前的條件以或者的關(guān)系過濾數(shù)據(jù)。negate就是將當前條件取反。看下具體使用方式

public List conditionFilterNegate(List list, Predicate predicate){
    return list.stream().filter(predicate.negate()).collect(Collectors.toList());
}

public List conditionFilterAnd(List list, Predicate predicate,Predicate predicate2){
    return list.stream().filter(predicate.and(predicate2)).collect(Collectors.toList());
}

public List conditionFilterOr(List list, Predicate predicate,Predicate predicate2){
    return list.stream().filter(predicate.or(predicate2)).collect(Collectors.toList());
}

//大于5并且是偶數(shù)
result = predicateTest.conditionFilterAnd(list, integer -> integer > 5, integer1 -> integer1 % 2 == 0);
result.forEach(System.out::println);//6 8 10
System.out.println("-------");

//大于5或者是偶數(shù)
result = predicateTest.conditionFilterOr(list, integer -> integer > 5, integer1 -> integer1 % 2 == 0);
result.forEach(System.out::println);//2 4 6 8 9 10
System.out.println("-------");

//條件取反
result = predicateTest.conditionFilterNegate(list,integer2 -> integer2 > 5);
result.forEach(System.out::println);// 1 2 3 4 5
System.out.println("-------");

我們分別借助Predicate的三個默認方法定義了conditionFilterAnd、conditionFilterOr和conditionFilterNegate方法。然后再下方調(diào)用這三個方法,根據(jù)傳入的判斷條件觀察輸出結(jié)果。

最后再來看一下Predicate接口中的唯一一個靜態(tài)方法,Java8中接口中除了增加了默認方法也可以定義靜態(tài)方法。

/**
 * Returns a predicate that tests if two arguments are equal according
 * to {@link Objects#equals(Object, Object)}.
 *
 * @param  the type of arguments to the predicate
 * @param targetRef the object reference with which to compare for equality,
 *               which may be {@code null}
 * @return a predicate that tests if two arguments are equal according
 * to {@link Objects#equals(Object, Object)}
 */
static  Predicate isEqual(Object targetRef) {
    return (null == targetRef)
            ? Objects::isNull
            : object -> targetRef.equals(object);
}

isEqual方法返回類型也是Predicate,也就是說通過isEqual方法得到的也是一個用來進行條件判斷的函數(shù)式接口實例。而返回的這個函數(shù)式接口實例是通過傳入的targetRef的equals方法進行判斷的。我們看一下具體用法

System.out.println(Predicate.isEqual("test").test("test"));//true

這里會用第一個"test"的equals方法判斷與第二個"test"是否相等,結(jié)果true。

下一篇

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70682.html

相關(guān)文章

  • Java8-5-Function函數(shù)式接口進階與默認方法詳解

    摘要:函數(shù)式接口進階與默認方法詳解上一篇我們快速的借助示例演示了的簡單應(yīng)用,體會到了使用對集合處理的便捷和其與函數(shù)式接口密不可分的關(guān)系,所以為了更高效的使用,有必要更熟練的掌握函數(shù)式接口。 Java8-5-函數(shù)式接口進階與默認方法詳解上一篇我們快速的借助示例演示了stream api的簡單應(yīng)用,體會到了使用stream api對集合處理的便捷和其與函數(shù)式接口密不可分的關(guān)系,所以為了更高效的使...

    Miracle_lihb 評論0 收藏0
  • Collection接口詳解

    摘要:接口接口作為集合類的父類接口,位于包下,定義了很多集合操作的方法。今天我希望通過對源碼的查閱來對接口有所認識,下面我們直接進入源碼分析接口源碼可以看出,接口繼承接口。 Collection接口 Collection接口作為集合類的父類接口,Collectio位于java.util包下,Collectio定義了很多集合操作的方法。今天我希望通過對源碼的查閱來對Collection接口有所...

    IamDLY 評論0 收藏0
  • Java常見集合知識詳解

    摘要:集合的種類常見的集合類分如下幾個種類詳解接口是和接口的父接口,也是集合類除外根接口。接口集合中元素的存放特點是元素有序,同一元素可重復(fù)。總結(jié)中集合是一個非常重要的知識點,在實際運用中也是常常會使用到。 集合的種類 常見的集合類分如下幾個種類: Collection - List - ArrayList - LinkedList - Set - HashSet...

    lewinlee 評論0 收藏0
  • 六大設(shè)計原則詳解(1)-單一職責原則

    摘要:方法比如一個修改用戶名和密碼的需求,我們把它寫在一個方法里天津市上述代碼的方法職責不明確,既有修改用戶名又修改地址,不符合單一職責原則。 Android學(xué)習(xí)資源分享合集(1)-視頻資源 簡介: 單一職責原則(SRP:Single responsibility principle),它規(guī)定一個類應(yīng)該只有一個發(fā)生變化的原因。所謂職責是指類變化的原因。如果一個類有多于一個的動機被改變,那么這...

    sihai 評論0 收藏0
  • ES6的Iterator對象詳解

    摘要:實現(xiàn)原理創(chuàng)建一個指針對象,指向當前數(shù)據(jù)結(jié)構(gòu)的起始位置。也就是說,遍歷器對象本質(zhì)上,就是一個指針對象。具體來說,就是返回一個包含和兩個屬性的對象。接口部署在對象的屬性上可以調(diào)用這個屬性,就得到遍歷器對象。 Iterator實現(xiàn)原理 創(chuàng)建一個指針對象,指向當前數(shù)據(jù)結(jié)構(gòu)的起始位置。也就是說,遍歷器對象本質(zhì)上,就是一個指針對象。 第一次調(diào)用指針對象的next方法,可以將指針指向數(shù)據(jù)結(jié)構(gòu)的第一...

    KoreyLee 評論0 收藏0

發(fā)表評論

0條評論

Joyven

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<