stream 常用代码片段

前言

java8 stream 及 Lambda 表达式已经在之前章节介绍过,这里主要梳理一些常用的代码片段,便于使用查阅,人的记忆毕竟是有限的。

准备数据-- List

准备如下User对象集合

List<User> userList = new ArrayList<>();
        userList.add(new User(1L, "a"));
        userList.add(new User(2L, "b"));
        userList.add(new User(2L, "c"));
        userList.add(new User(3L, "d"));
        userList.add(new User(3L, "e"));

list to map 转换

  1. 普通的处理 – 重复会有异常
Map<Long, String> userMap = ListUtils.emptyIfNull(userList).stream()
            .collect(Collectors.toMap(User::getId, User::getUsername);

大家会发现有异常,其实Java8提供的Collectors.toMap() 方法中,其第三个参数就是当出现 duplicate key的时候的处理方案:
如下:
方案一: 出现重复时,取前面value的值,或者取后面放入的value值,则覆盖先前的value值。

Map<Long, String> userMap = ListUtils.emptyIfNull(userList).stream()
        .collect(Collectors.toMap(User::getId, User::getUsername, (v1, v2) -> v1));
        
Map<Long, String> userMap = ListUtils.emptyIfNull(userList).stream()
        .collect(Collectors.toMap(User::getId, User::getUsername, (v1, v2) -> v2));

方案二: Map的value可以储存一个list,把重复key的值放入list,再存到value中.

Map<Long, List<String>> userMap = ListUtils.emptyIfNull(userList).stream()
	.collect(Collectors.toMap(User::getId,
                e -> Arrays.asList(e.getUsername()),
                (List<String> oldList, List<String> newList) -> {
                    oldList.addAll(newList);
                    return oldList;
                }));

不过这种已经改变了目标map的结构。

排序

直接排序:

   list.stream().sorted(Comparator.comparing(Student::getAge)) 

利用 ComparisonChain:

list.sort((o1, o2) -> ComparisonChain.start()
                .compare(o1.getPid() == 0 ? 0 : 1, o2.getPid() == 0 ? 0 :1)
                .result());

map循环

Map<String, Object>  map = Maps.newHashMap();

循环1:

 MapUtils.emptyIfNull(map).forEach((k, v) -> {
 })

循环2:

MapUtils.emptyIfNull(map).entrySet().stream().forEach( t -> {
           
       });

合并两个list为一个map

场景:

/**
  * keys [1,2,3,2] values [10,20,40,40]  ----> {1:10,2:60,3:40}
  **/
   Map<Integer,Integer> twolistToMap(List<Integer> keys, List<Integer> values){
    return IntStream.range(0,keys.size())
            .boxed()
            .collect(Collectors.toMap(keys::get,values::get,(e1,e2)->e1+e2));
   }

总结

持续更新代码片段。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值