如何用Java Stream写出既高雅又装*的代码
作者:ktoking 发布时间:2022-04-13 23:23:58
标签:Java,Stream,Guava,Lambda
git仓库直达
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://blog.csdn.net/kingtok/article/details/119786880
0
投稿
猜你喜欢
- 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有n个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把
- 相关api见:点击进入/* * Copyright 2014 the original author or authors. * * Lic
- JDK12的五大重要新特性Java12在March 19, 2019发布了。在2017年发布Java 9之后,Java平台发布节奏已从每3年
- PowerPoint幻灯片中可插入公式,用于在幻灯片放映时演示相关内容的论证、推算的依据,能有效地为演讲者提供论述的数据支撑。通过后端程序代
- 1. IOC和DI首先,我们应该明确,IOC是一种思想,并不是Spring特有的,而是软件工程逐步发展的一种产物,是一种优秀的编程思想,之所
- 有人问我,怎么判断一个点是不是在多边形内,本来想着把这个多边形分成一个又一个三角形,如图, 然后判断这个点是不是在某个三角形中,如
- 父类空间优先于子类对象产生在每次创建子类对象时,先初始化父类空间,再创建其子类对象本身。目的在于子类对象中包含了其对应的父类空间,便可以包含
- 上一篇说到Springboot整合Netty,自定义协议实现,本文聊一些拆包/沾包问题。拆包/沾包问题TCP是面向字节流的协议,在发送方发送
- 日常工作中,不管你是写Unit Test,还是采用TDD的编程方式进行开发,都会遇到断言。而断言的风格常见的会有Assert、BDD风格,对
- 开篇语Synchronized,Java 友好的提供了的一个关键字,它让开发者可以快速的实现同步。它就像一个星星,远远看去就是一个小小的点。
- Web Fragment 是什么 - 它是在 servlet 3.0开始支持的,可以把一个dy web项目拆分为多个项目,解耦合,使其在项目
- 前言 短时间提升自己最快的手段就是背面试题,最近总结了Java常用的面试题,分享给大家,希望大家都能圆梦大厂,加油,我命由我不由天
- 一. 依赖管理Ⅰ. 部分dependency导入时为啥不需要指定版本?我们创建项目时添加的依赖并没有帮我们指定版本号<>,那Sp
- 五一期间原计划是写两篇文章,看一本技术类书籍,结果这五天由于自律性过于差,禁不住各种诱惑,我连电脑都没打开过,计划完美宣告失败。所以在这能看
- 在 fluro 中,定义路由处理器 Handler 时可以指定该页面的默认转场形式,或者在使用 navigateTo 方法是可以设置页面跳转
- springboot项目启动,访问报404错误今天在做一个springboot项目的时候,是接着别人的项目写的,写完之后想做一下测试,于是就
- 这篇文章主要介绍了java property配置文件管理工具框架过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考
- Statement 和 PreparedStatement之间的关系和区别. 关系:Prepa
- IntelliJ IDEA中实现跟eclipse一样的outline方法,查看文件内所有已经声明的方法。mac的可以在key map 里搜索
- 因为线程重用导致的信息错乱的bugThreadLocal一般用于线程间的数据隔离,通过将数据缓存在ThreadLocal中,可以极大的提升性