groovy 简化了 Java 语法,并且增加了一些集合的常用操作
Java8 中也提供了 stream 以满足复杂的集合操作需求
日常集合操作代码案例这里都有
创建
创建数组
|
|
创建list
- java 语法
|
|
- groovy 语法
集合与数组的转换
创建map
###
java 语法
groovy 语法
def map=[:] //空的map def map=["a":1 ,"b":2]
遍历
Java 遍历 list
groovy 遍历 list
Java 遍历 map
方法一
def map = ["a": 1, "b": 2] for (Map.Entry<String,Integer> entry : map) { println entry.key+"---"+entry.value }
方法二
只对 key 遍历 for (String key : map.keySet()) { System.out.println(key + " = " + map.get(key)); } 只对 value 遍历 for (String value : map.values()) { System.out.println("value = " + value); }
方法三
Iterator<Map.Entry<String, Integer>> entries = map.entrySet().iterator(); while (entries.hasNext()) { Map.Entry<String, Integer> entry = entries.next(); System.out.println(entry.key + " = " + entry.value); }
方法四
考虑实际场景如果你的value类型比较复杂你最好带着泛型 map.forEach((String k,Integer v)->{ System.out.println(k+" = "+v); }); 如果比较简单当然你可以把泛型去掉 map.forEach((k,v)->{ System.out.println(k+" = "+v); }); 如果仅仅是输出你还可以更简单 map.forEach((k,v)-> System.out.println(k+" = "+v));
groovy 遍历 map
方法一
map.each { k, v -> println k + "---" + v }
方法二:可以获取下标
map.eachWithIndex { Map.Entry<String, Integer> entry, int i -> println entry.key + " = " + entry.value+ "---"+i }
筛选
去重
排序
集合
|
|
分组
合并
多个 list 合并成一个
List<List<Integer>> list = [[1], [11,12], [21,22,23], [31,32,33], [41,42,43,44]]
List<Integer> result = list.stream()
.flatMap({ it.stream().map({it}) })
.collect(Collectors.toList());
或者
List<Integer> result = list.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
println list
输出结果:[1, 11, 12, 21, 22, 23, 31, 32, 33, 41, 42, 43, 44]
–
复杂的场景:多个异步执行结果的返回值合并到一起
CompletableFuture future1=CompletableFuture.supplyAsync({
TimeUnit.SECONDS.sleep(1) //延迟一秒返回
return [1,2,3]
});
CompletableFuture future2=CompletableFuture.supplyAsync({
TimeUnit.SECONDS.sleep(5) //延迟五秒返回
return [4,5,6,7,8,9]
});
List<Integer> collect= Stream.of(future1,future2)
.flatMap({(it.join() as List<Integer>).stream().map({it}) })
.collect(Collectors.toList());
println collect
五秒钟后输出结果:[1, 2, 3, 4, 5, 6, 7, 8, 9]
多个map的结果合并到一起
转换
list 转 map
一个list:提取一个属性作为key,其他的值作为value
|
|
java8
|
|
两个长度相同的list:一个list作为key,另外一个list对应的下标值作为value
setUp:
String[] arr1 = ["a", "b", "c"]
Integer[] arr2 = [4, 5, 6]
想要的结果:[a:4, b:5, c:6]
方法1:最常规的做法在遍历一个集合的同时通过下标获取另一个
Map<String,Integer> result=[:]
arr1.eachWithIndex { String entry, int i ->
result.put(entry,arr2[i])
}
方法2: 先转换为二维数组再把二维数组转换为map,感觉比较玩的花哨
def result = [arr1, arr2].transpose() //先转换为:[["a",4],["b",5],["c",6]]
.inject([:]) { entry, it ->entry + [(it[0]):(it[1])]}
方法3:和方法2思想一样,只是混合 Java8 的语法
def result = [arr1, arr2].transpose()
.stream().collect(Collectors.toMap({it[0]},{it[1]}))
map 转 list
转换内容格式
def a=[1,2,3].stream().map({it+"转成字符串格式"}).collect(Collectors.toList())
def b=[1,2,3].collect({ it+"转成字符串格式" })
println a
println b
合并
map合并
|
|
分页
java8
|
|
guava
|
|
本文出自 “腾飞工作室” 博客,请务必保留此出处:http://tfgzs.net/2017/06/26/groovy和Java混合编程之集合的使用/