java Guava funtion_Guava库学习:函数编程(一)使用Function和Functions进行对象转换...

在了解和学习Guava中Function和Functions之前,我们需要先来简单的了解一下函数式编程,函数编程是一种编程范型,强调使用函数来实 现对象不断变化的状态,其本质是一种编程方法或编程思想,著名的函数式编程语言有:Lisp、Erlang、Clojure、Scala等,在JDK8之 前,java只能通过匿名类来达到近似函数式编程的效果,不过JDK8已经增加了函数式编程的支持,而使用Guava,我们可以在JDK5以上,就使用 Java进行函数式编程。

在Guava中,提供了多种接口或类,来进行函数式编程,我们可以使用Function和Functions进行对象转换,使用Predicate和 Predicates进行对象过滤,使用Supplier和Suppliers进行对象的包装构建等,我们首先学习Function和Functions 进行对象转换。

在Java开发中,我们经常需要对一些对象做一些处理,然后返回我们需要看的结果,比如说:对日期进行格式化,获取字符串表示等,当然,我们可以使用String的Formatter来处理(详见:JDK1.5中java.util.Formatter类的学习探究和使用),不过在Guava中我们可以使用Function接口来实现类似的需求,如下:

@Test

public void testFunction() {

Function function = new Function() {

@Override

public String apply(Date input) {

return new SimpleDateFormat("yyyy-MM-dd").format(input);

}

};

System.out.println(function.apply(new Date()));//2014-08-21

}

我们看到,Function接口中的apply方法,接收input参数,返回处理后的结果,我们可以通过调用apply方法,获取想要的结果,其实做过 Android的,会感觉上面的很熟悉,我们在Android开发中,一些事件的处理,编码都类似于上面的风格,这就是所谓的函数式编程。

翻开Function接口的源码,里面只有简单的apply和equals两个方法,我们重点来看apply方法,apply方法接收一个输入对象并返回 一个输出 对象。一个好的Function实现应该没有副作用,也就是说对象作为参数传递方法调用apply方法后应保持不变。

多数情况下,我们都需要自己书写Function接口的实现,以适应工作的需求,不过Guava提供了Functions工具类,其包含了一些常用的Fu nction实现,翻开Functions源码,我们看到有以下几个方法,值得注意的是,其中大量使用了枚举的单例实现【更多:三种方式实现类的Singleton(单例)】,这里不再赘述,其中公有的方法如下:

toStringFunction():返回ToStringFunction的唯一实例,ToStringFunction主要是对返回传入对象调用toString方法后的表示。

identity():返回IdentityFunction的唯一实例。

forMap(Map map),forMap(Map map, @Nullable V defaultValue):接收一个Map集合作为参数,返回一个Function,用于执行Map集合的查找。

compose(Function g, Function f):接收两个Function作为参数,返回两个Function的组合。

forPredicate(Predicate predicate):接收Predicate,转变为Function,更多Predicate,参见【Guava库学习:函数编程(二)使用Predicate和Predicates进行对象过滤】

constant(@Nullable E value):为任何输入的值构造一个Function

forSupplier(Supplier supplier):接收Supplier,转变为Function,更多Supplier,参见【Guava库学习:函数编程(三)使用Supplier和Suppliers进行对象的包装构建】

接下来,我们通过实例代码,学习其中的两个重要的方法,forMap和compose方法,如下:

@Test

public void testFunctions() {

Map map = new HashMap() {

//构造一个测试用Map集合

{

put("love", 1);

put("miss", 2);

}

};

/**

* forMap

*/

Function function = Functions.forMap(map);

//调用apply方法,可以通过key获取相应的value

System.out.println(function.apply("love"));//i love u

//当apply的key值在Map里不存在时,会抛出异常

//java.lang.IllegalArgumentException: Key 'like' not present in map

//        System.out.println(function.apply("like"));

//我们可以通过forMap重载的另一个方法避免异常,当Key不存在时,设置一个默认值

function = Functions.forMap(map, 0);

System.out.println(function.apply("like"));//can't find this key

/**

* 有时候,我们需要多个Function进行组合,

* 这时就需要用到compose,如下:

*/

//我们有一个Function用于将输入的数字进行平方运算

Function function1 = new Function() {

@Override

public Integer apply(Integer input) {

return input * input;

}

};

//我们将上面Map中的value值全部进行平方运算

/**

* Warning:这里compose方法的参数位置不能颠倒,

* Function compose(Function g, Function

* 传入Function、Function组合成Function

*/

Function result = Functions.compose(function1, function);

System.out.println(result.apply("love"));//I LOVE U

//当Key值不存在时,结果也是大写的

System.out.println(result.apply("like"));//CAN'T FIND THIS KEY

}

总结:学习了Function和Functions之后,不是很理解这样设计的原因,也不太清楚Function和Functions的实际用 处,Guava的参考资料上说:函数式编程在Guava核心库Collections里面有大量体现,学习到Collections的时候再深入理解吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值