如何用Java Stream写出既高雅又装*的代码

 更新时间:2021年08月20日 16:42:54   作者:ktoking  
如何让同事看不懂你写的代码,然后觉得你非常牛逼,这里用到了stream()与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);
        });

在这里插入图片描述

好家伙直接装一波,直接起飞~ 制作不易,转载请标注

到此这篇关于如何用Java Stream写出既高雅又装*的代码的文章就介绍到这了,更多相关Java Stream内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java方法重写和super关键字实例详解

    java方法重写和super关键字实例详解

    这篇文章主要介绍了java方法重写和super关键字实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • java模拟客户端向服务器上传文件

    java模拟客户端向服务器上传文件

    这篇文章主要为大家详细介绍了java模拟客户端向服务器上传文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 一文详解gRPC快速整合SpringCloud

    一文详解gRPC快速整合SpringCloud

    这篇文章主要为大家介绍gRPC快速整合SpringCloud的实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • java实现收藏名言语句台词的app

    java实现收藏名言语句台词的app

    本文给大家分享的是使用java制作的记录名人名言台词等等让你难忘的语句的APP的代码,非常的实用,有需要的小伙伴可以参考下。
    2015-04-04
  • 基于Hutool的图片验证码功能模块实现

    基于Hutool的图片验证码功能模块实现

    为了提高系统的安全性,防止接口被暴力刷新,验证码是个好的手段,图片验证码没有短信验证码的费用,其是个人开发者学习的重点,这篇文章主要介绍了基于Hutool的图片验证码功能模块实现,需要的朋友可以参考下
    2022-10-10
  • Java超详细分析@Autowired原理

    Java超详细分析@Autowired原理

    @Autowired注解可以用在类属性,构造函数,setter方法和函数参数上,该注解可以准确地控制bean在何处如何自动装配的过程。在默认情况下,该注解是类型驱动的注入
    2022-06-06
  • Java中泛型学习之细节篇

    Java中泛型学习之细节篇

    泛型在java中有很重要的地位,在面向对象编程及各种设计模式中有非常广泛的应用,下面这篇文章主要给大家介绍了关于Java中泛型细节的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • SpringBoot执行异步任务Async介绍

    SpringBoot执行异步任务Async介绍

    这篇文章主要为大家介绍了SpringBoot执行异步任务Async示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • java比较器comparator使用示例分享

    java比较器comparator使用示例分享

    这篇文章主要介绍了java比较器comparator使用示例,需要的朋友可以参考下
    2014-03-03
  • SpringBoot集成Shiro进行权限控制和管理的示例

    SpringBoot集成Shiro进行权限控制和管理的示例

    这篇文章主要介绍了SpringBoot集成Shiro进行权限控制和管理的示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03

最新评论