介绍下Guava中比较重要的几个类:Function、Predicate、Supplier
以及对应的工具类:Functions、Predicates、Suppliers
Function
Function是一个接口,本质是用来做转换的。主要是用apply
方法把input
转换为另外一个对象。一般都是用匿名内部类的方式使用。源码如下:
public interface Function<F, T> {
T apply(@Nullable F input);
boolean equals(@Nullable Object object);
}
java目前不支持闭包(除了java8),对于闭包,java目前只能说用匿名类,但是内部类语法的代码量比较大,如果大量用匿名类会使得代码难以阅读和维护。如果了解javascript中的function对象和apply方法,会对guava的Function类的语义理解有很重要的帮助
Fucntion的一个转换实例
将日期型,转换为字符串
Function<Date, String> fun = new Function<Date, String>() {
public String apply(Date input) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return sdf.format(input);
}
};
String apply = fun.apply(new Date());
System.out.println(apply); //输出:2016-06-14 17:33:03
从上面的代码没看出来Function有啥好的地方,反而使得代码更复杂了。所以并不是所有的转换场景都适合用Function。一些简单原则是
- 能用简单的方法,就不要用Function
- 一般单一对象转换不需要用Function,针对集合的可以考虑使用
Function的集合实例
ArrayList<String> lists = Lists.newArrayList("a", "b", "c");
List<String> objects = FluentIterable.from(lists).transform(new Function<String, String>() {
public String apply(String input) {
return input + "-" + input;
}
}).toList();
System.out.println(objects);//输出[a,-a,, b-b, c-c]
使用FluentIterable.from(list).tranfrom(Function)
来转换真个集合的元素
Functions
Functions针对Function提供了一些工具类
compose
组合Function,比如Function1是把A转换为B,Function2是把B转换为C,可是用compose组合