Guava中Predicate的常见用法

1.  Predicate基本用法

guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterables, Lists, Sets, Maps, Multimaps中用到。

Predicate最基本的用法就是对Collection进行过滤,guava中很多集合的filter方法都是用Predicate来实现过滤的。

Collection typeFilter method
IterableIterables.filter(Iterable, Predicate)FluentIterable.filter(Predicate)
IteratorIterators.filter(Iterator, Predicate)
CollectionCollections2.filter(Collection, Predicate)
SetSets.filter(Set, Predicate)
SortedSetSets.filter(SortedSet, Predicate)
MapMaps.filterKeys(Map, Predicate)Maps.filterValues(Map, Predicate)Maps.filterEntries(Map, Predicate)
SortedMapMaps.filterKeys(SortedMap, Predicate)Maps.filterValues(SortedMap, Predicate)Maps.filterEntries(SortedMap, Predicate)
MultimapMultimaps.filterKeys(Multimap, Predicate)Multimaps.filterValues(Multimap, Predicate)Multimaps.filterEntries(Multimap, Predicate)

注意:

Lists没有提供filter方法;

过滤后的集合一般通过Lists.newArrayList(Collections2.filter(list, predicate))拿到。

2. Predicate接口

Predicate接口提供了一个泛型方法apply,在使用时根据需求实现

Predicate继承了Object的equals方法,并提供了多个实现,主要是为了提供一个通用的方法,用于Object为Predicate类型时。

Guava中Predicate的常见用法-LMLPHP
package com.google.common.base;

import com.google.common.annotations.GwtCompatible;

import javax.annotation.Nullable;

@GwtCompatible

public interface Predicate<T> { boolean apply(@Nullable T input); @Override

boolean equals(@Nullable Object object);

}

Guava中Predicate的常见用法-LMLPHP

3. Predicates的常用方法

Predicates时guava中与Predicate配套使用的工具类,返回Predicate实例。

下面是一个例子

Guava中Predicate的常见用法-LMLPHP
package link.mengya;

/**
  • Created by chang on 16/2/19.

    */

    public class User {

    private String userName;

    private int age; public User(String userName, int age) {

    this.userName = userName;

    this.age = age;

    } public String getUserName() {

    return userName;

    } public int getAge() {

    return age;

    } public void setUserName(String userName) {

    this.userName = userName;

    } public void setAge(int age) {

    this.age = age;

    }

    }

Guava中Predicate的常见用法-LMLPHP
Guava中Predicate的常见用法-LMLPHP
package link.mengya.utils;

import com.google.common.base.Predicate;

import com.google.common.base.Predicates;

import com.google.common.collect.Iterables;

import com.google.common.collect.Iterators;

import com.google.common.collect.Lists;

import link.mengya.User; import java.util.ArrayList;

import java.util.List;

import java.util.Objects; /**
  • Created by chang on 16/2/19.

    */
/**
  • Predicate 返回为true 的保留, 返回为false的过滤掉
  • Predicates.and(predicate1, predicate2) predicate1 与 predicate2 返回都为true的保留
  • Predicates.or(predicate1, predicate2) predicate1 与 predicate2 有一个返回true 则保留

    */

    public class PredicateTest {

    public static void main(String[] args){

    List<User> users = new ArrayList<User>();

    users.add(new User("chang",24));

    users.add(new User("chen",26));

    users.add(new User("sun",24));
     </span><span style="color: #008000;">//</span><span style="color: #008000;">保留age不为26的User</span>
    Predicate&lt;User&gt; predicate1 = <span style="color: #0000ff;">new</span> Predicate&lt;User&gt;<span style="color: #000000;">() {
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span><span style="color: #000000;"> apply(User user) {
    </span><span style="color: #0000ff;">if</span>(user.getAge() != 26<span style="color: #000000;">){
    </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">true</span><span style="color: #000000;">;
    }
    </span><span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span><span style="color: #000000;">;
    }
    }; </span><span style="color: #008000;">//</span><span style="color: #008000;">保留userName 是 chang 的user</span>
    Predicate&lt;User&gt; predicate2 = <span style="color: #0000ff;">new</span> Predicate&lt;User&gt;<span style="color: #000000;">() {
    </span><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">boolean</span><span style="color: #000000;"> apply(User user) {
    </span><span style="color: #0000ff;">return</span> Objects.equals(user.getUserName(),"chang"<span style="color: #000000;">);
    }
    }; </span><span style="color: #008000;">//</span><span style="color: #008000;">保留age不为 26 以及 userName 是 chang 的User</span>
    Predicate&lt;User&gt; predicate1_and_predicate2 =<span style="color: #000000;"> Predicates.and(predicate1, predicate2); </span><span style="color: #008000;">//</span><span style="color: #008000;">保留age不为26 或 userName 是 chang的User</span>
    Predicate&lt;User&gt; predicate1_or_predicate2 =<span style="color: #000000;"> Predicates.or(predicate1, predicate2); </span><span style="color: #008000;">//</span><span style="color: #008000;">与predicate1条件相反</span>
    Predicate&lt;User&gt; notpredicate1 =<span style="color: #000000;"> Predicates.not(predicate1); </span><span style="color: #008000;">//</span><span style="color: #008000;">List&lt;User&gt; filteredUsers = Lists.newArrayList(Iterators.filter(users.iterator(), predicate1));</span>
    List&lt;User&gt; filteredUsers1 =<span style="color: #000000;"> Lists.newArrayList(Iterables.filter(users,predicate1));
    List</span>&lt;User&gt; filteredUsers2 =<span style="color: #000000;"> Lists.newArrayList(Iterables.filter(users,predicate2));
    List</span>&lt;User&gt; filteredUsers1and2 =<span style="color: #000000;"> Lists.newArrayList(Iterables.filter(users,predicate1_and_predicate2));
    List</span>&lt;User&gt; filteredUsers1or2 =<span style="color: #000000;"> Lists.newArrayList(Iterables.filter(users,predicate1_or_predicate2)); List</span>&lt;User&gt; filteredUsersNot1 =<span style="color: #000000;"> Lists.newArrayList(Iterables.filter(users,notpredicate1)); System.out.println(</span>"result size for filteredUsers1: " + filteredUsers1.size()); <span style="color: #008000;">//</span><span style="color: #008000;">2-&gt; chang sun</span>
    System.out.println("result size for filteredUsers2: " + filteredUsers2.size()); <span style="color: #008000;">//</span><span style="color: #008000;">1-&gt; chang</span>
    System.out.println("result size for filteredUsers1and2: " + filteredUsers1and2.size()); <span style="color: #008000;">//</span><span style="color: #008000;">1-&gt; chang</span>
    System.out.println("result size for filteredUsers1or2: " + filteredUsers1or2.size()); <span style="color: #008000;">//</span><span style="color: #008000;">2-&gt; chang sun</span>

System.out.println("result size for filteredUsersNot1: " + filteredUsersNot1.size()); //1-> chen

}

}

Guava中Predicate的常见用法-LMLPHP

更多关于guava中Predicates与Functions的用法参见

guava-libraries的wiki: https://code.google.com/p/guava-libraries/wiki/FunctionalExplained

guava github上的wiki:https://github.com/google/guava/wiki/FunctionalExplained#predicates

	</div>
<div class="postDesc">posted @ <span id="post-date">2016-02-20 13:39</span> <a href="http://www.cnblogs.com/onlychang92/">chang20159</a> 阅读(<span id="post_view_count">494</span>) 评论(<span id="post_comment_count">0</span>) <a href="https://i.cnblogs.com/EditPosts.aspx?postid=5203139" rel="nofollow">编辑</a> <a href="#" onclick="AddToWz(5203139);return false;">收藏</a></div>
</div>
posted @
2016-12-24 00:10 
jobs-lgy 
阅读(...) 
评论(...) 
编辑 
收藏
04-17 23:04