如何用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
投稿
猜你喜欢
- 由于项目需要做一些图形展示,所以就想到了使用Directx和OpenGL来绘图,但项目准备使用C#来开发(大家比较熟悉C#),在网上看了相关
- 现在智能手机基本都是触摸操作,点击按钮是一种交互方式,同时手势相关的操作,比如滑动等等同样是很重要的交互方式。这篇文章是对安卓手势交互相关知
- 介绍:Selenium 是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包
- 本示例演示如何通过设置Intent对象的标记,来改变当前任务堆栈中既存的Activity的顺序。1. Intent对象的Activity启动
- 前言Java8 由Oracle在2014年发布,是继Java5之后最具革命性的版本。Java8吸收其他语言的精髓带来了函数式编程,lambd
- 本文实例讲述了基于C#实现XML文件读取工具类。分享给大家供大家参考。具体如下:这是我去年写的一个XML文件读取工具类,现在做了一些调整 基
- 继上一次利用Servlet实现图片上传,这次利用基于MVC的Struts框架,封装了Servlet并简化了JSP页面跳转。JSP上传页面上传
- mybatisplus支持多种主键生成策略,默认采用认 ID_WORKER 即雪花算法雪花算法snowflflake是Twitter开源的分
- 1.Action中的validate()方法Struts2提供了一个Validateable接口,这个接口中只存在validat
- 问题描述 idea启动tomcat后乱码了,并且,idea的各种编码都是设置的为UTF-8,但是中文就是乱码了。解决方法 进入idea的安装
- 此文主要想和大家分享的是这段时间,对权限管理和设计的断断续续的思考学习,和个人的一些软件开发等方面的看法。 提到'权限管理和设计
- 项目中需要实现一个状态显示的悬浮框,要求可以设置两种模式:拖动模式和不可拖动模式。实现效果图如下:实现步骤:1.首先要设置该悬浮框的基本属性
- 本文实例为大家分享了一个基于JAVA的知乎爬虫,抓取知乎用户基本信息,基于HttpClient 4.5,供大家参考,具体内容如下详细内容:抓
- 一般要做正圆形图片,只能是正方形的基础上才能实现,否则就变成椭圆了,下面说说如何使长方形的图片生成正圆形图片废话不多说,没图没真相,先上图吧
- 开发环境:jdk版本:JDK8maven版本:maven-3.5.2开发工具:Itellij IDEA 2017.1前提条件:已安装以上软件
- 对其做了些优化,但此种sql生成方式仅适用于复杂程度不高的sql,所以实用性不是很高,仅仅是写着玩的,知道点mybatis的注解形式的使用方
- 拿到了项目框架工程代码却没有uml图,那么方法之间的调用关系功能流转就不容易看出来,那么如何产生类图呢,记忆里方法有下:1.rose逆向工程
- 引入:前段时间去银行办业务,排队的人那是真多,自己正式办理业务也就不到5分钟,但是却足足等了两个小时(相信很多人都遇到过这种情况),对这种服
- 在多线程对一个整数进行自增操作时,需要用synchronized进行同步。然而,如果synchronized的对象选取的不合适的话,就无法实
- LRU算法:最近最少使用淘汰算法(Least Recently Used)。LRU是淘汰最长时间没有被使用的缓存(即使该缓存被访问的次数最多