Java Stream如何寫出高雅又裝*的代碼
- 一. 冷靜分析
- 二. 直接開裝
- 2.1 初級炫
- 2.2 普通炫
- 2.3 高級炫
- 2.4 再炫一波 拿到當前key與對應的數量
- 2.5 Map Reduce炫
- 好家伙直接裝一波,直接起飛~ 制作不易,轉載請標注
git倉庫直達
如何讓同事看不懂你寫的代碼 然后覺得你非常牛逼 這里用到了stream()與Lambda 需要有點基礎,沒基礎你炫個🔨
優雅永不過時~ 看下面文章時記得穿燕尾服 拿高腳杯

List<String> strings = Lists.newArrayList("name=kk", "sex=1", "tel=1111", "email=xx@qq.com","name=ww","name=yy");
一. 冷靜分析
如上代碼,你現在要做一個分組的Map將上面list的值讀取出來,然后分組統計類似于Map<String,List< String >> 將Key相同的Val全部存到一個list里面
二. 直接開裝
不會真有人還直接遍歷吧,那別人不就看的懂了~ 為了炫技直接裝一波
定義封裝物件
@Data
@Builder
static class ObiectMap{
private String key;
private String value;
}
2.1 初級炫
System.out.println("map1: ");
Map<String, List<String>> collect1 = strings.stream().map(e -> { //封裝成物件
String[] split = e.split("\\=", 2);
return ObiectMap.builder().key(split[0]).value(split[1]).build();
}).collect(Collectors.toMap(ObiectMap::getKey,v->Lists.newArrayList(v.getValue()), (List<String> newList, List<String> oldList) -> { // Collectors.toMap(a,b,(n1,n2)) -> a代表Map的key (這里直接用方法參考拿到key) b代表value (n1,n2)代表key相同時value的處理辦法,直接合并List
oldList.addAll(newList);
return oldList;
}));
collect1.forEach((k,v)->{
System.out.printf(k+" { ");
String vList = v.stream().collect(Collectors.joining(",")); //加上逗號,最后一個不加
System.out.printf(vList);
System.out.printf(" }");
System.out.println();
});
System.out.println();
結果如下

2.2 普通炫
System.out.println("map2: ");
Map<String, List<String>> collect2 = strings.stream().map(e -> {
String[] split = e.split("\\=", 2);
return ObiectMap.builder().key(split[0]).value(split[1]).build();
}).collect(Collectors.groupingBy(ObiectMap::getKey, Collectors.mapping(ObiectMap::getValue, Collectors.toList()))); //Collectors.groupingBy(a,b) a還是通過key來分組 ,b將value收集起來做list value
collect2.forEach((k,v)->{
System.out.printf(k+" { ");
String vList = v.stream().collect(Collectors.joining(",")); //加上逗號,最后一個不加
System.out.printf(vList);
System.out.printf(" }");
System.out.println();
});
System.out.println();
結果如下

2.3 高級炫
用Guava來炫
import com.google.common.collect.*
System.out.println("map3: get name List with Multimap");
List<ObiectMap> collect3 = strings.stream().map(e -> {
String[] split = e.split("\\=", 2);
return ObiectMap.builder().key(split[0]).value(split[1]).build();
}).collect(Collectors.toList());
Multimap<String, String> multiMap = ArrayListMultimap.create(); //使用Guava的Multimap來存 value直接是collection,可以隨意轉換
collect3.forEach(c -> multiMap.put(c.getKey(), c.getValue()));
System.out.println(multiMap.get("name").stream().collect(Collectors.joining(",")));
System.out.println();
結果如下

2.4 再炫一波 拿到當前key與對應的數量
System.out.println("map4: get name with count");
Map<String, Long> collect4 = strings.stream().map(e -> {
String[] split = e.split("\\=", 2);
return ObiectMap.builder().key(split[0]).value(split[1]).build();
}).collect(Collectors.groupingBy(ObiectMap::getKey, Collectors.counting())); // 拿到數量
collect4.forEach((k,v)->{
System.out.printf(k+" { ");
System.out.printf("%d",v);
System.out.printf(" }");
System.out.println();
});
System.out.println();
結果如下

2.5 Map Reduce炫
這個不能處理重復value,只是將單一Map聚合到一個Map
List<String> strings = Lists.newArrayList("name=kk", "sex=1", "tel=1111", "email=xx@qq.com");
Map<String, String> reduce = strings.stream().map(e -> {
String[] split = e.split("\\=", 2); // 正則劃分為單map
return Collections.singletonMap(split[0], split[1]);
}).reduce(new HashMap<String, String>(), (accMap, singleMap) -> { // reduce(a,(b,c))-> a 為初始值 b為累加值 c為當前值 操作回傳當前值與累加值后的結果 將多個單KV的Map組合成一個Map
accMap.putAll(singleMap);
return accMap;
});
reduce.forEach((k,v)->{
System.out.println(k+" = "+v);
});

好家伙直接裝一波,直接起飛~ 制作不易,轉載請標注
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/295153.html
標籤:java
上一篇:用Python實作自動發訊息,自定義內容,太省事了!
下一篇:日期處理類
