Guava函数式编程(2)

使用Predicate接口

可以说Predicate接口和Function接口是具有相似的功能,Predicate接口也有两个方法:

public interface Predicate {
   boolean apply(T input)
   boolean equals(Object object)
}

可以看出Predicate返回时boolean类型,对比Function接口主要是对输入的对象进行变换,而Predicate接口是对输入对象的过滤。
简单的示例,比如过滤出上一章节中所有城市中人口最小值的城市:

public class PopulationPredicate implements Predicate {
     @Override
     public boolean apply(City input) {
           return input.getPopulation() <= 500000;
     }
}

使用Predicates类

直接上代码,定义两个关于城市特性的Predicate接口实现类:

public class TemperateClimatePredicate implements Predicate {
   @Override
   public boolean apply(City input) {
         return input.getClimate().equals(Climate.TEMPERATE);
   }
}

public class LowRainfallPredicate implements Predicate {
   @Override
   public boolean apply(City input) {
       return input.getAverageRainfall() < 45.7;
   }
}
  • 使用Predicates.and
    Predicates.and方法里面接收Predicate接口的实现类,参数是可变参数,也就是说,组合每个Predicate,只有当所有的Predicate实现类的apply方法返回true,才符合条件:
Predicate smallAndDry =  Predicates.and(smallPopulationPredicate,lowRainFallPredicate);

如上的smallAndDry表示城市要同时人口少于500000,并且降雨量小于45.7。
Predicates.and方法参数有下面两个:

Predicates.and(Iterable> predicates);
Predicates.and(Predicate ...predicates);
  • 使用Predicates.or
    Predicates.or,表示只要给定的Predicate接口中的一个apply方法返回true,则成立。还有,如果有三个Predicate,第一个就成立了,就直接返回,后面的Predicate不会继续处理。
Predicate smallTemperate =
Predicates.or(smallPopulationPredicate,temperateClimatePredicate);

上面表示,在所有的城市中过滤,人口小于50000,或者降雨量小于45.7的城市。
同样的,Predicates.or有下面两个参数方法:

Predicates.or(Iterable> predicates);
Predicates.or(Predicate ...predicates);

*使用Predicates.not
Predicates.not就是相反的,如果apply方法返回true,则为false;反之,则为true;

Predicate largeCityPredicate = Predicate.not(smallPopulationPredicate);
  • Predicates.compose
    Predicates.compose 可以结合使用Function接口的实现类和Predicate接口的实现类:
public class SouthwestOrMidwestRegionPredicate implements Predicate {
       @Override
       public boolean apply(State input) {
             return input.getRegion().equals(Region.MIDWEST) ||
                       input.getRegion().equals(Region.SOUTHWEST);
       }
  }

下面就通过compose方法过滤出MIDWEST和SOUTHWEST的城市:

Predicate predicate = Predicates.compose(southwestOrMidwestRegionPredicate,lookup);

你可能感兴趣的:(Guava函数式编程(2))