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

	</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 
阅读(...) 
评论(...) 
编辑 
收藏

Guava中Predicate的常见用法的更多相关文章

  1. JAVA中enum的常见用法

    JAVA中enum的常见用法包括:定义并添加方法.switch.遍历.EnumSet.EnumMap 1.定义enum并添加或覆盖方法 public Interface Behaviour{ void ...

  2. Java中枚举的常见用法

    在JDK1.5以后引入了一种新的类型,就是枚举(enum).enum是用来声明枚举类型数据,它可以像数组一样存储许多的元素,但是不同于数组的是,它除了数字不能存储以外, 其他类型的如字母.特殊符号.汉 ...

  3. (转)轻松掌握shell编程中数组的常见用法及示例

    缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习 ...

  4. Objective-C中#define的常见用法

    参考博客 http://blog.csdn.net/kindazrael/article/details/8108868 在C语言中,预处理代码是非常强大的工具,能让代码变得可读性和可维护性更强.预处 ...

  5. 转:VC中MessageBox的常见用法

    一.关于MessageBox       消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.       1.MessageBox("这是一个最简单的 ...

  6. VC中MessageBox的常见用法

    一.关于MessageBox       消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.       1.MessageBox("这是一个最简单的 ...

  7. K:java中枚举的常见用法

    用法一:常量   在JDK1.5 之前,我们定义常量都是: public static fianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. ...

  8. VC++中MessageBox的常见用法详解

    消息框是个很常用的控件,属性比较多,本文列出了它的一些常用方法,及指出了它的一些应用场合.         1.MessageBox("这是一个最简单的消息框!");        ...

  9. Objective-C中Block的常见用法

    typedef int(^AddValue)(int,int); int main(int argc, const char * argv[]) { @autoreleasepool { //1:NS ...

随机推荐

  1. rem在响应式布局中的应用

    rem/em/px/pt的基友关系 px 像素相对长度单位,相对于显示器屏幕分辨率而言 em 相对长度单位,根据其父元素来设置字体大小 pt point,是印刷行业常用单位,等于1/72英寸 rem ...

  2. JavaScript MVC框架和语言总结[infoq]

    infoq关于javascript的语言和框架的总结,非常全面,值得一读. http://www.infoq.com/minibooks/emag-javascript Contents of the ...

  3. Map集合概述

    java集合最后一站之Map,给自己的总结画个句号... Map用于保存具有映射关系的数据. 1.HashMap和Hashtable实现类 HashMap和Hashtable都是Map接口的典型实现类 ...

  4. Win7重装系统遇到的问题以及MysQL的问题解决

    连续三天因为系统的错误,android方面的软件一直不能正确运行.而且每次开机的时候QQ 微信等聊天工具也出现损坏.虽然重新下载一个可以保证在电脑不管的情况下正常的运行.可是作为玩电脑时间不长的我来说 ...

  5. ReactiveCocoa基础知识内容2

    引用网络上一些实例的代码,针对ReactiveCocoa的运用可以更加有帮助: 1:跟AF结合时的写法,返回RACSignal - (RACSignal *)fetchQuestionWithTag: ...

  6. 【原】iOS优秀开源项目总结

    网上此类帖子博客不少,不过自己没整理过的东西始终是别人,现开此贴加以总结,持续更新!站在巨人的肩膀上才能站得高看得远. 第一部分:UI类 1.毛玻璃模糊效果 RNFrostedSidebar 一个iO ...

  7. linux下安装jdk+tomcat+eclipse+mysql

    我的环境:主机是win7的,虚拟机是VWare  Workstation 6.0   ,linux系统为Red Hat Enterprise  Linux 5 64位 各软件版本:jdk是jdk-6u ...

  8. 在线研讨会webinars

    我是怎么一步一步找到这里的?  jedox-jedox Webinars (不懂意思)--->google [      webinars      open source ],->htt ...

  9. Asp.net WebPages框架运行原理浅析(转)

    在Asp.net4和4.5中,新增了WebPages Framework,编写页面代码使用了新的Razor语法,代码更加的简洁和符合Web标准,编写方式更接近于PHP和以前的Asp,和使用 WebFo ...

  10. 3、Javascript学习 - IT软件人员学习系列文章

    接下来,我们开始进入Javascript语言的学习. Javascript语言是一种解释性的语言,不同于ASP.NET.C#语言的这种编译性的语言.它随着HTML网页的发布而发布,就是说嵌入到HTML ...