您的位置:首页 > 其它

Guava functional -- Predicate

2016-06-19 18:20 309 查看
Guava全文介绍地址:Google Guava

这次主要介绍是的是com.google.common.base.Predicate.在JDK8之前Java是不能使用函数式编程的,但是Guava给予了我们这样的能力。Predicate就是这样其中的一个类。而且大多数时候Predicate是和Predicates是组合来使用的,Predicate大概有以下用法:

1. Predicate检查传递对象是否满足给定的条件

2. Predicate主要是使用Iterables, Iterators, Collections2等类的filter方法来过滤集合

3. Predicate通常也用Iterables.all()来检测集合中的所有元素满足指定的条件

4. Predicates这个类提供了实用的方法,并且允许多个Predicate组成一样Predicate。这点与Function有点像。

我们首先来看看这个接口的方法。

boolean apply(T input)
返回输入的值应用predicate后的结果

boolean equals(Object object)
判断另一个对象是否等于这个predicate.


这个接口与Function有点像,只不过Function返回的是对应的值,而Predicate是返回是否满足条件,返回值为boolean类型。

下面我们根据几个小例子来看这个类的用法。

基础类:

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User implements Serializable {

/** 身份证号 */
private long idCard;
/** 姓名 */
private String name;
/** age */
private int age;

}


1、判断年龄是否都大于25

@Test
public void shouldUseCustomPredicate(){
// given
User user1 = new User(1L, "carl",26);
User user2 = new User(2L, "kevin", 24);
User user3 = new User(3L, "erin", 25);
Predicate<User> userAgePredicate = new Predicate<User>() {
@Override
public boolean apply(User input) {
return input.getAge() > 25;
}
};

// when
boolean allUserAgeBeyond25 = Iterables.all(Lists.newArrayList(user1, user2, user3), userAgePredicate);

// then
assertFalse(allUserAgeBeyond25);
}


2、多个Predicate通过Predicates的and(),or(),not()组合使用

@Test
public void shouldComposeTwoPredicates(){
// given
User user1 = new User(1L, "carl",26);
User user2 = new User(2L, "kevin", 24);
Predicate<User> userAgePredicate = new Predicate<User>() {
@Override
public boolean apply(User input) {
return input.getAge() > 25;
}
};

Predicate<User> userNamePredicate = new Predicate<User>() {
@Override
public boolean apply(User input) {
return "carl".equals(input.getName());
}
};
Predicate<User> nameAndAgePredicate = Predicates.and(userAgePredicate, userNamePredicate);
// when
boolean carlAgeBeyond25 = Iterables.all(Lists.newArrayList(user1, user2), nameAndAgePredicate);

// then
assertFalse(carlAgeBeyond25);
}


3、Predicates类的containsPattern方法用于创建条件使用正则表达式

@Test
public void shouldCheckPattern() throws Exception {

// given
Predicate<CharSequence> twoDigitsPredicate = Predicates.containsPattern("\\d\\d");

// then
assertThat(twoDigitsPredicate.apply("Hello world 40")).isTrue();
}


4、Predicate类的in方法,用于判断集合中包含对象

@Test
public void shouldFindObjectInCollection() throws Exception {

// given
Predicate elevenInCollectionPredicate = Predicates.in(Arrays.asList(11L, 22L, 33L, 44L));

// then
assertThat(elevenInCollectionPredicate.apply(11L)).isTrue();
}


以上差不多就是Predicate类的使用方法,至于其它用法。就看大家去挖掘了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: