guava(4)函数式编程

函数式编程:

转载自:http://my.oschina.net/indestiny/blog/215041

使用Function接口(jdk8中已经存在):

1 /**
2  * 其功能就是将输入类型转换为输出类型
3  */
4 public interface Function<F, T> {
5   T apply(@Nullable F input);
6 }
比如一个简单的日期转换:
01 /**
02  * 日期转换
03  */
04 public class DateFormatFunction implements Function<Date, String> {
05     @Override
06     public String apply(Date input) {
07         SimpleDateFormat dateFormat = new SimpleDateFormat("dd/mm/yyyy");
08         return dateFormat.format(input);
09     }
10 }

使用Functions类:

  • Functions.forMap()方法:
1 /**
2  * 州类
3  */
4 public class State {
5     private String name;
6     private String code;
7     private Set<City> mainCities = new HashSet<City>();
8 }
现在你想在一个Map<String, State>(key为州的编号)对象中查找某个key, 你可以:
1 Map<String, State> states = new HashMap<String, State>();
2 Function<String, State> lookup = Functions.forMap(states);
3 System.out.println(lookup.apply(key));//key不存在会抛异常
4  
5 //你也可以给不存在的key指定一个默认值
6 Function<String, State> lookup = Functions.forMap(states, null);
  • Functions.compose()方法
01 /**城市类**/
02 public class City {
03     private String name;
04     private String zipCode;
05     private int population;
06  
07     @Override
08     public String toString() {
09         return name;
10     }
11 }
1 /**
2  * 将州的城市转换为字符串
3  */
4 public class StateToCityString implements Function<State, String> {
5     @Override
6     public String apply(State input) {
7         return Joiner.on(",").join(input.getMainCities());
8     }
9 }

你可以通过组合Function,查找某州的城市列表

1 Function<String, State> lookup = Functions.forMap(states);
2 Function<State, String> stateFunction = new StateToCityString(); //州到城市的转换
3 Function<String, String> stateCitiesFunction = Functions.compose(stateFunction, lookup); //组合Function
4 System.out.println(stateCitiesFunction.apply(key));
等价于:
1 stateFunction.apply(lookup.apply(key));

使用Predicate接口(jdk8中已存在):

  • Predicate接口
1 public interface Predicate<T> {
2      boolean apply(T input); //不同于Function.apply, 该apply用于过滤对象
3 }
如:
1 /**
2  * 过滤人口小于500000的城市
3  */
4 public class PopulationPredicate implements Predicate<City> {
5     @Override
6     public boolean apply(City input) {
7         return input.getPopulation() <= 500000;
8     }
9 }

使用Predicates类:

有两个过滤条件:

01 /**
02  * 选择气候为TEMPERATE的城市
03  */
04 public class TemperateClimatePredicate implements Predicate<City> {
05     @Override
06     public boolean apply(City input) {
07         return input.getClimate().equals(Climate.TEMPERATE);
08     }
09 }
10  
11 /**
12  * 选择雨量小于45.7的城市
13  */
14 public class LowRainfallPredicate implements Predicate<City> {
15     @Override
16     public boolean apply(City input) {
17         return input.getAverageRainfall() < 45.7;
18     }
19 }

你可以运用下面的方法实现过滤组合等:

1 Predicates.and(smallPopulationPredicate,lowRainFallPredicate);//且
2 Predicates.or(smallPopulationPredicate,temperateClimatePredicate);//或
3 Predicate.not(smallPopulationPredicate);//非
4 Predicates.compose(smallPopulationPredicate,lookup);//组合转换再过滤

使用Supplier接口:

  • Supplier接口
1 public interface Supplier<T> {
2        T get(); //用于创建对象
3 }

使用Suppliers类:

  • Suppliers.memorize()方法:
1 SupplyCity sc = new SupplyCity();
2 System.out.println(Suppliers.memoize(sc).get());
3 System.out.println(Suppliers.memoize(sc).get());//返回同一对象, 单例
  • Suppliers.memorizeWithExpiration()方法:
01 SupplyCity sc = new SupplyCity(); //超时再新建对象, 类似缓存
02 Supplier<City> supplier = Suppliers.memoizeWithExpiration(sc, 5, TimeUnit.SECONDS);
03 City c = supplier.get();
04 System.out.println(c);
05 Thread.sleep(3000);
06 c = supplier.get();
07 System.out.println(c); //与之前相等
08 Thread.sleep(2000);
09 c = supplier.get();
10 System.out.println(c); //与之前不等
Guava函数式编程基础,后面集合处理中,将体现得更强大。

不吝指正。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值