Guava函数式编程(2)

使用Predicate接口

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

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

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

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

使用Predicates类

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

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

public class LowRainfallPredicate implements Predicate<City> {
   @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<Predicate<T>> predicates);
Predicates.and(Predicate<T> ...predicates);
  • 使用Predicates.or
    Predicates.or,表示只要给定的Predicate接口中的一个apply方法返回true,则成立。还有,如果有三个Predicate,第一个就成立了,就直接返回,后面的Predicate不会继续处理。
Predicate smallTemperate =
Predicates.or(smallPopulationPredicate,temperateClimatePredicate);

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

Predicates.or(Iterable<Predicate<T>> predicates);
Predicates.or(Predicate<T> ...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<State> {
       @Override
       public boolean apply(State input) {
             return input.getRegion().equals(Region.MIDWEST) ||
                       input.getRegion().equals(Region.SOUTHWEST);
       }
  }

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

Predicate<String> predicate = Predicates.compose(southwestOrMidwestRegionPredicate,lookup);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容