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. SharePoint 2013 JavaScript 对象判断用户权限

    场 景 近期有个场景,判断当前用户对项目有没有编辑权限,使用JavaScript完成,弄了好久才弄出来,分享一下,有需要的自行扩展吧,具体如下: 代 码 function getPermissions ...

  2. 【思维导图】Fiddler学习笔记

    最近在学习Fiddler这款工具,边学边画了如下的思维导图,可以方便自己对这款工具有一个全面的了解. 软件介绍(摘自百度百科):Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电 ...

  3. Source Insight基本使用和快捷键

    Source Insight基本使用和快捷键 为什么要用Source Insight呢?貌似是因为比完整的IDE要更快一些,比较利于查看大量的代码. 软件的安装很简单,设置好安装目录. 配置好文档路径 ...

  4. JSON解析实例——使用Json-lib

    JSON解析实例——使用Json-lib Json-lib下载及使用 本文介绍用一个类库进行JSON解析. 工具下载地址:http://sourceforge.net/projects/json-li ...

  5. umeng 渠道统计 android

    1.配置AndroidManifest.xml,添加权限 <uses-permission android:name="android.permission.ACCESS_NETWOR ...

  6. Java笔试题(一)

    一. 选择题(共50题,每题2分,共100分.多选题选不全或选错都不得分.) 7. 以下说法错误的是()/*这个我感觉是全对,谁知道哪个错啦,讲解下,非常感谢*/A) super.方法()可以调用父类 ...

  7. 【代码笔记】iOS-16进制颜色与UIColor互转

    一,效果图 二,工程目录. 三,代码 RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additio ...

  8. Charles中如何对https抓包

    前言:下面介绍关于Charles中如何对https抓包 1.在默认没有相关设置HTTPS需要设置相关操作的时候,会出现下面的情况: 2.下面就是设置SSL Proxying,然后443是默可用的端口 ...

  9. hypervisor与VMware共存方法

    bcdedit /set hypervisorlaunchtype offbcdedit /set hypervisorlaunchtype auto

  10. git操作之常见问题解决方案

    一.版本不一致 1. 错误信息: > git push -u origin master To ******.git ! [rejected] master -> master (non- ...