Google Collections给我们带来了一对非常优雅的东东,叫做:Functions and Predicates! 和你使用的scala一样有神奇的地方,现在你可以使用在no-functional 的java身上了。你可以在com.google.common.base包里找到这些(更多)。
我们将在下一部分过滤集合的时候谈到Predicates类,首先我们先看一下Function的用法!
Google collections提供了Function接口,实际上,一个function就是从一个对象到另外一个对象的转换变形。
像Lists和Maps这类的Collection工具类给我们提供了转换的方法:
举个例子来说,假设你有一个Map,key是物品,value是对应的价格,单位是欧元。那么,你有个需求是将里面的价格都转换为美元,传统的做法是遍历整个Map,然后更新每个value值,将价格转换为美元价格,好麻烦...
有了Functions,世界一下子变清净了...
好吧,你可能说匿名内部类搞的有点糟,因为 你可能想重用这个function---这里只是演示函数式的一些特点而已。
和这个类似的,我们也可以使用Functions来把一个对象转换成一个完全不同的对象,比如将一个整形转换为字符串。
我们稍后再深入Functions类,首先我们浏览一下Multimap集合以及我们如果使用一点function来转换一个集合。
我在Integrasco做数据工作时遇到的最常见的任务是过滤数据和对大集合进行排序。 简单起见,我们假设你有一个姓名列表想要过滤(看起来有点幼稚):
我们可以使用com.google.common.collect.Iterables和com.google.common.base.Predicates类来过滤例子中的列表,使过滤后的列表中只包含Aleksander或者Jaran:
现在我知道这听起来有点傻帽,但是你仍然可以实现自己的Predicates条件类,比如返回名字长度小于5的列表(我从codemonkeyism.com偷到了下面这个例子):
这个例子返回的是Aleksander,Jaran以及Java(因为Java的长度小于5)。or条件的部分读起来有点绕,但我还可以忍受。equalTo以及or条件都是Predicates自带的方法,用起来很方便。
现在我们来实现一个lengthLessThan的条件,我们只需要这么做:
把这个实现在你的工具类里包装一下就像这样:
关注一下Stephan的博文fluent interfaces for Google Collections --写的相当优雅~!
多亏有了java Collections类,我们可以这么排序:
但有时候我们想做更复杂一些的事情,比如合并多个Comparator或者我们可能只是想要排序过的集合的一个视图,而不改变原来集合的顺序。
Google Collections给我们提供了Ordering,让我们更好地掌控排序。假如我们有两个对Person类排序的comparator,一个是根据lastName排序,一个是根据firstName排序:
那么,假如我们现在想现根据last name排序,再根据first name排序,然后对排序结果反序,那我们需要做的是:
而且,你甚至无需创建Comparator比较器,你可以直接扩展Ordering类!
在这个系列的第一部分,Steve提到了在Scala中,你可以这么做:
功能是说从people这个集合中筛选出firstName为“Steve”的,并且按他们的lastName属性排序。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-64410-4.html
啦啦啦啦啦啦啦啦啦啦啦啦啊啦啦啦啦老K
门槛在门里的不都这样么
原料环节不能有蛆吗