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类型时。

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));

        //保留age不为26的User
        Predicate<User> predicate1 = new Predicate<User>() {
            public boolean apply(User user) {
                if(user.getAge() != 26){
                    return true;
                }
                return false;
            }
        };


        //保留userName 是 chang 的user
        Predicate<User> predicate2 = new Predicate<User>() {
            public boolean apply(User user) {
                return Objects.equals(user.getUserName(),"chang");
            }
        };

        //保留age不为 26 以及 userName 是 chang 的User
        Predicate<User> predicate1_and_predicate2 = Predicates.and(predicate1, predicate2);

        //保留age不为26 或 userName 是 chang的User
        Predicate<User> predicate1_or_predicate2 = Predicates.or(predicate1, predicate2);

        //与predicate1条件相反
        Predicate<User> notpredicate1 = Predicates.not(predicate1);

        //List<User> filteredUsers = Lists.newArrayList(Iterators.filter(users.iterator(), predicate1));
        List<User> filteredUsers1 = Lists.newArrayList(Iterables.filter(users,predicate1));
        List<User> filteredUsers2 = Lists.newArrayList(Iterables.filter(users,predicate2));
        List<User> filteredUsers1and2 = Lists.newArrayList(Iterables.filter(users,predicate1_and_predicate2));
        List<User> filteredUsers1or2 = Lists.newArrayList(Iterables.filter(users,predicate1_or_predicate2));

        List<User> filteredUsersNot1 = Lists.newArrayList(Iterables.filter(users,notpredicate1));

        System.out.println("result size for filteredUsers1: " + filteredUsers1.size());          //2->  chang sun
        System.out.println("result size for filteredUsers2:  " + filteredUsers2.size());         //1-> chang
        System.out.println("result size for filteredUsers1and2:  " + filteredUsers1and2.size()); //1-> chang
        System.out.println("result size for filteredUsers1or2:  " + filteredUsers1or2.size());   //2-> chang sun

        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

转载于:https://www.cnblogs.com/onlychang92/p/5203139.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值