zoukankan      html  css  js  c++  java
  • Guava中Predicate的常见用法

    Guava中Predicate的常见用法

    1.  Predicate基本用法

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

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

    Collection type Filter method
    Iterable Iterables.filter(Iterable, Predicate) FluentIterable.filter(Predicate)
    Iterator Iterators.filter(Iterator, Predicate)
    Collection Collections2.filter(Collection, Predicate)
    Set Sets.filter(Set, Predicate)
    SortedSet Sets.filter(SortedSet, Predicate)
    Map Maps.filterKeys(Map, Predicate) Maps.filterValues(Map, Predicate) Maps.filterEntries(Map, Predicate)
    SortedMap Maps.filterKeys(SortedMap, Predicate) Maps.filterValues(SortedMap, Predicate) Maps.filterEntries(SortedMap, Predicate)
    Multimap Multimaps.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类型时。

    复制代码
    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);
    }

    复制代码

    3. Predicates的常用方法

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

    下面是一个例子

    复制代码
    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;
      }
      }

    复制代码
    复制代码
    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中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

  • 相关阅读:
    C#字符串(截取)
    字符串的截取(从指定位置)
    UVALive 7146 Defeat the Enemy(贪心+STL)(2014 Asia Shanghai Regional Contest)
    UVALive 7148 LRIP(树的分治+STL)(2014 Asia Shanghai Regional Contest)
    Google Code Jam Round 1A 2015 解题报告
    编程之美2015资格赛 解题报告
    ZOJ 3781 Paint the Grid Reloaded(BFS)
    【转】赞一下huicpc035
    【转】lonekight@xmu·ACM/ICPC 回忆录
    【转】[退役]纪念我的ACM——headacher@XDU
  • 原文地址:https://www.cnblogs.com/jobs-lgy/p/6216497.html
Copyright © 2011-2022 走看看