google-collections让Java代码更简化
Groovy吸引人的地方是简洁流畅的语法,以及因之产生的高可读性。那么有办法让Java代码也变得更简化,更可读么?TheKaptain在博文给出了一个解决方法:google-collections,文中举出了google-collections的对Collection的简化方法。
创建Collection
Groovy的一个闪光点就是可以灵活的定义Collection,比如:List,map,空的Collection,不可变的Collection。但是在Java代码中,创建List还可以,但是创建Map就有点繁琐了,尤其是不可变的Map。这时就可以使用google-collections来简化代码。比如:
1importcom.google.common.collect.ImmutableMap
2Map<String, String> groovyMap = ["a":"1","b":"2"].asImmutable()
3
4Map<String, String> javaMap =newLinkedHashMap<String,String>()
5javaMap.put("a","1")
6javaMap.put("b","2")
7javaMap = Collections.unmodifiableMap(javaMap)
8
9Map<String, String> googleMap = ImmutableMap.of("a","1","b","2")
过滤Collection
Groovy中可以通过“findAll”执行闭包来过滤Collection。Google-collections也通过Predicate接口以及Collections2中的两个静态方法提供了类似的功能。示例代码如下:
01importstaticcom.google.common.collect.Collections2.*
02importcom.google.common.base.Predicate
03List<Integer> toFilter = [1,2,3,4,5]
04List<Integer> groovyVersion = toFilter.findAll{ it <3}
05defgoogleVersion = filter(toFilter,newPredicate<Integer>()
06{
07publicbooleanapply(Integer input)
08{
09returninput <3;
10}
11})
用String连接Collection
对于Groovy中的List能够使用join将其中的元素连接起来。Google-collections则调用Joiner这个类达到了同样的效果。示例代码如下:
1importstaticcom.google.common.base.Joiner.*
2deftoJoin = ['a','b','c']
3defseparator =', '
4
5//groovy version
6defgroovyJoin = toJoin.join(separator)
7
8//google-collections version
9defgoogleJoin = on(separator).join(toJoin)
Google-collections还可以对Map进行连接,这个是Groovy中遗漏的内容。示例代码中给出了连接的三种方式,如下:
01importstaticcom.google.common.base.Joiner.*
02deftoJoin = [1:'a',2:'b',3:'c']
03defseparator =', '
04defkeyValueSeparator =':'
05
06defgoogleVersion = on(separator).withKeyValueSeparator(keyValueSeparator).join(toJoin)
07
08googleVersion = on(" and ").withKeyValueSeparator(" is ").join(toJoin)
09
10defgroovyVersion = toJoin.inject([]) {builder, entry ->
11builder <<"${entry.key} is ${entry.value}"
12}.join(' and ')
Multimap
你是否在纯Java中编写这样的代码:Map的元素值是一个List。还记得代码么?来看看使用Google-collections实现这样一个Map的代码:
1classGroovyMultimap{
2Map map = [:]
3publicbooleanput(Object key, Object value) {
4List list = map.get(key, [])
5list.add(value)
6map."$key"= list
7}
8}
Java代码是不是简单的许多?Google-collections和最新的Guava(含有Google-collections)还有许多简化代码的方法,比如对File、 Stream等的简化。如果你对降低Java代码量以及让代码更可读感兴趣,那就看看TheKaptain的原文吧!
1 | 
import com.google.common.collect.ImmutableMap
 | 
2 | 
Map<String, String> groovyMap = ["a":"1", "b":"2"].asImmutable()
 | 
3 | 
4 | 
Map<String, String> javaMap = new LinkedHashMap<String,String>()
 | 
5 | 
javaMap.put("a", "1")
 | 
6 | 
javaMap.put("b", "2")
 | 
7 | 
javaMap = Collections.unmodifiableMap(javaMap) | 
8 | 
9 | 
Map<String, String> googleMap = ImmutableMap.of("a", "1", "b", "2")
 | 
01 | 
import static com.google.common.collect.Collections2.*
 | 
02 | 
import com.google.common.base.Predicate
 | 
03 | 
List<Integer> toFilter = [1, 2, 3, 4, 5]
 | 
04 | 
List<Integer> groovyVersion = toFilter.findAll{ it < 3}
 | 
05 | 
def googleVersion = filter(toFilter, new Predicate<Integer>()
 | 
06 | 
{
 | 
07 | 
public boolean apply(Integer input)
 | 
08 | 
{
 | 
09 | 
return input < 3;
 | 
10 | 
}
 | 
11 | 
})
 | 
1 | 
import static com.google.common.base.Joiner.*
 | 
2 | 
def toJoin = ['a', 'b', 'c']
 | 
3 | 
def separator = ', '
 | 
4 | 
5 | 
//groovy version | 
6 | 
def groovyJoin = toJoin.join(separator)
 | 
7 | 
8 | 
//google-collections version | 
9 | 
def googleJoin = on(separator).join(toJoin)
 | 
01 | 
import static com.google.common.base.Joiner.*
 | 
02 | 
def toJoin = [1: 'a', 2: 'b', 3: 'c']
 | 
03 | 
def separator = ', '
 | 
04 | 
def keyValueSeparator = ':'
 | 
05 | 
06 | 
def googleVersion = on(separator).withKeyValueSeparator(keyValueSeparator).join(toJoin)
 | 
07 | 
08 | 
googleVersion = on(" and ").withKeyValueSeparator(" is ").join(toJoin)
 | 
09 | 
10 | 
def groovyVersion = toJoin.inject([]) {builder, entry ->
 | 
11 | 
builder << "${entry.key} is ${entry.value}"
 | 
12 | 
}.join(' and ')
 | 
1 | 
class GroovyMultimap{
 | 
2 | 
Map map = [:]
 | 
3 | 
public boolean put(Object key, Object value) {
 | 
4 | 
List list = map.get(key, [])
 | 
5 | 
list.add(value)
 | 
6 | 
map."$key" = list
 | 
7 | 
}
 | 
8 | 
} |