Java8 | 如何优雅地初始化Map & List2Map ?


theme: scrolls-light

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

🤞 个人主页:@青Cheng序员石头
🤞 粉丝福利:加粉丝群 一对一问题解答,获取免费的丰富简历模板、提高学习资料等,做好新时代的卷卷王!

伟大的Java 18都快面世了,而我们可能还对Java 8的核心Lambda用法还不熟悉,这篇文章就Stream技术分享几个开发过程中操作Map的使用小技巧,看完这篇文章,相信你一定会对Stream有一个全新的认识。

一、优雅地初始化一个Map

往下看之前,先想想如果不借助于Apache common等三方包,你会如何初始化一个有着初始值的Map,想好了继续往下看,代码大致是如下面的代码所示吧。

java final HashMap<String, String> maps = new HashMap<>(); maps.put("key1", "value1"); maps.put("key2", "value2"); 以上的方式确实能做到初始化Map,但是最大的问题是我们可能需要换很多行去put键值对,显得很重复啰嗦,为了保持代码的整洁,发挥Java 8 的优势,我们其实可以像下面的代码使用stream去进行初始化。

java final HashMap<String, String> maps = Stream.of(new Object[][]{{"key1", "value1"}}) .collect(Collectors.toMap(data -> (String) data[0], data -> (String) data[1])); 一行代码完成Map的初始化工作,是不是要显得优雅许多。如果你们用过jooqTuple,那么你会发现使用Tuple会更加优雅,能完成更多不可思议的事情。

二、优雅地List to Map

在日常开发过程中,后端的小伙伴为了构造特定的数据格式给前端,无法避免需要将List数据转化成Map数据,那么请问遇到这样的问题,你们会如何去完成这件事情呢? 一般来说,肯定是通过遍历的方式去完成数据的转化。但Java 8Stream,我们能用它来做点有趣的事情。

假如我们有一个类Product,如下面的代码所示。 @Getter @Setter @ToString @Builder class Product{ private Long id; private String category; private String name; } 我们现在获取到了List<Product>格式的数据。 java static List<Product> getList(){ final List<Product> productList = new ArrayList<>(100); for(int i =1;i<=100;i++){ productList.add(Product.builder() .id((long) i) .name("name"+i) .category("category"+i%9) .build()); } return productList; }

现在,我们要获取以id为key,name为value的Map格式数据,代码如下。 java Map<Long, String> map = productList.stream().collect(Collectors.toMap(Product::getId, Product::getName)); 那如果要获取以id为key,product为value的Map格式数据,代码如下。 java Map<Long, Product> map = productList.stream().collect(Collectors.toMap(Product::getId, data -> data)); 那如果要获取以category为key,name为value的Map格式数据,key可能会冲突,如何解决呢,需要传入key冲突解决的策略,代码如下。

```java

冲突发生时,保留先存在的数据,可按照业务自定义

Map map = productList.stream().collect(Collectors.toMap(Product::getCategory, Product::getName, (existing, replacement) -> existing)); 那如果要最终获取**线程安全的Map**,如何解决呢,需要传入一个`Supplier<M> mapSupplier`,代码如下。 java

这里引入的是ConcurrentHashMap,同样的也可以用TreeMap的实现

ConcurrentHashMap map = productList.stream().collect(Collectors.toMap(Product::getCategory, Product::getName, (existing, replacement) -> existing, ConcurrentHashMap::new)); ```


少年,没看够?点击石头的详情介绍,随便点点看看,说不定有惊喜呢?欢迎支持点赞/关注/评论,有你们的支持是我更文最大的动力,多谢啦!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值