java 8中 predicate chain的使用

java 8中 predicate chain的使用java

簡介

Predicate是一個FunctionalInterface,表明的方法須要輸入一個參數,返回boolean類型。一般用在stream的filter中,表示是否知足過濾條件。git

boolean test(T t);

基本使用

咱們先看下在stream的filter中怎麼使用Predicate:github

@Test
    public void basicUsage(){
        List<String> stringList=Stream.of("a","b","c","d").filter(s -> s.startsWith("a")).collect(Collectors.toList());
        log.info("{}",stringList);
    }

上面的例子很基礎了,這裏就很少講了。測試

使用多個Filter

若是咱們有多個Predicate條件,則可使用多個filter來進行過濾:code

public void multipleFilters(){
        List<String> stringList=Stream.of("a","ab","aac","ad").filter(s -> s.startsWith("a"))
                .filter(s -> s.length()>1)
                .collect(Collectors.toList());
        log.info("{}",stringList);
    }

上面的例子中,咱們又添加了一個filter,在filter又添加了一個Predicate。接口

使用複合Predicate

Predicate的定義是輸入一個參數,返回boolean值,那麼若是有多個測試條件,咱們能夠將其合併成一個test方法:ip

@Test
    public void complexPredicate(){
        List<String> stringList=Stream.of("a","ab","aac","ad")
                .filter(s -> s.startsWith("a") &&  s.length()>1)
                .collect(Collectors.toList());
        log.info("{}",stringList);
    }

上面的例子中,咱們把s.startsWith("a") && s.length()>1 做爲test的實現。get

組合Predicate

Predicate雖然是一個interface,可是它有幾個默認的方法能夠用來實現Predicate之間的組合操做。string

好比:Predicate.and(), Predicate.or(), 和 Predicate.negate()。it

下面看下他們的例子:

@Test
    public void combiningPredicate(){
        Predicate<String> predicate1 = s -> s.startsWith("a");
        Predicate<String> predicate2 =  s -> s.length() > 1;
        List<String> stringList1 = Stream.of("a","ab","aac","ad")
                .filter(predicate1.and(predicate2))
                .collect(Collectors.toList());
        log.info("{}",stringList1);

        List<String> stringList2 = Stream.of("a","ab","aac","ad")
                .filter(predicate1.or(predicate2))
                .collect(Collectors.toList());
        log.info("{}",stringList2);

        List<String> stringList3 = Stream.of("a","ab","aac","ad")
                .filter(predicate1.or(predicate2.negate()))
                .collect(Collectors.toList());
        log.info("{}",stringList3);

    }

實際上,咱們並不須要顯示的assign一個predicate,只要是知足
predicate接口的lambda表達式均可以看作是一個predicate。一樣能夠調用and,or和negate操做:

List<String> stringList4 = Stream.of("a","ab","aac","ad")
                .filter(((Predicate<String>)a -> a.startsWith("a"))
                        .and(a -> a.length() > 1))
                .collect(Collectors.toList());
        log.info("{}",stringList4);

Predicate的集合操做

若是咱們有一個Predicate集合,咱們可使用reduce方法來對其進行合併運算:

@Test
    public void combiningPredicateCollection(){
        List<Predicate<String>> allPredicates = new ArrayList<>();
        allPredicates.add(a -> a.startsWith("a"));
        allPredicates.add(a -> a.length() > 1);

        List<String> stringList = Stream.of("a","ab","aac","ad")
                .filter(allPredicates.stream().reduce(x->true, Predicate::and))
                .collect(Collectors.toList());
        log.info("{}",stringList);
    }

上面的例子中,咱們調用reduce方法,對集合中的Predicate進行了and操做。

總結

本文介紹了多種Predicate的操做,但願你們在實際工做中靈活應用。

本文的例子https://github.com/ddean2009/learn-java-streams/tree/master/predicate-chain

歡迎關注個人公衆號:程序那些事,更多精彩等着您!
更多內容請訪問 www.flydean.com
相關文章
相關標籤/搜索