guava(4)函数式编程

来源:互联网 发布:功夫英语 知乎 编辑:程序博客网 时间:2024/05/01 15:01

函数式编程:

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

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

1/**
2 * 其功能就是将输入类型转换为输出类型
3 */
4public interface Function<F, T> {
5  T apply(@Nullable F input);
6}
比如一个简单的日期转换:
01/**
02 * 日期转换
03 */
04public 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 */
4public class State {
5    private String name;
6    private String code;
7    private Set<City> mainCities = new HashSet<City>();
8}
现在你想在一个Map<String, State>(key为州的编号)对象中查找某个key, 你可以:
1Map<String, State> states = new HashMap<String, State>();
2Function<String, State> lookup = Functions.forMap(states);
3System.out.println(lookup.apply(key));//key不存在会抛异常
4 
5//你也可以给不存在的key指定一个默认值
6Function<String, State> lookup = Functions.forMap(states, null);
  • Functions.compose()方法
01/**城市类**/
02public 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 */
4public class StateToCityString implements Function<State, String> {
5    @Override
6    public String apply(State input) {
7        return Joiner.on(",").join(input.getMainCities());
8    }
9}

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

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

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

  • Predicate接口
1public interface Predicate<T> {
2     boolean apply(T input); //不同于Function.apply, 该apply用于过滤对象
3}
如:
1/**
2 * 过滤人口小于500000的城市
3 */
4public 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 */
04public 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 */
14public class LowRainfallPredicate implements Predicate<City> {
15    @Override
16    public boolean apply(City input) {
17        return input.getAverageRainfall() < 45.7;
18    }
19}

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

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

使用Supplier接口:

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

使用Suppliers类:

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

不吝指正。

0 0
原创粉丝点击