最近stream操作list用的特别爽,但是网上介绍复杂点的流操作并没有太多资料,介于我稍有研究,想把一些流的操作记录一下,以后参考
1,对list进行多key排序
list = list.stream().sorted(
Comparator.comparing(StreamService :: comparingByKey1)
.thenComparing(StreamService:: comparingByKey2)
.thenComparing(StreamService:: comparingByKey3)
.thenComparing(StreamService:: comparingByKey4)
.thenComparing(StreamService:: comparingByKey5)).collect(Collectors.toList());
StreamService 里需要声明的方法
private static String comparingByKey1(Map<String, Object> map){
return (String) map.get("Key1");
}
private static String comparingByKey2(Map<String, Object> map){
return (String) map.get("Key2");
}
private static String comparingByKey3(Map<String, Object> map){ return map.get("Key3").toString(); } private static String comparingByKey4(Map<String, Object> map){ return map.get("Key4").toString(); } private static String comparingByKey5(Map<String, Object> map){ return map.get("Key5").toString(); }
这样,list会从key1 - key5依次升序排序,
2 .list多项分组并合计某项
list = list.stream().collect(
Collectors.groupingBy(d -> String.format("%s||%s||%s||%s||%s", d.get("key1"), d.get("key2") , d.get("key3"),
d.get("key4") , d.get("key5")) ,
Collectors.summingDouble(d -> Double.parseDouble((String)d.get("quantity")))
)).entrySet().stream().map(entry -> {
Map<String, Object> map = new HashMap<String, Object>();
String[] keys = entry.getKey().split("\\|\\|");
map.put("1", keys[0]);
map.put("2", keys[1]);
map.put("3", keys[2]);
map.put("4", keys[3]);
map.put("5", keys[4]);
map.put("6", entry.getValue());
return map;
}).collect(Collectors.toList());
这样操作,会先把list 按key1 - key5分组并合计quantity
最终整合list 输出 list
1= key1
2= key2
3= key3
...
来获取到一个新的list