Java8 中常用的List Stream场景

发表于:2023-3-17 09:12

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:自学编程之道    来源:今日头条

  Stream是Java 8添加的一个API,结合Lambda表达式,可以提高我们对对集合处理的编码效率。在日常工作中,我们经常会遇到List转Map的情况,在Stream出来之前,我们一般都是遍历放进map中。
  这里,我们假设有个User对象。
  @Getter
  @Setter
  public class User
  {
      private String id;
      private String name;
      private Integer age;
  }
  List转Map
  1. Map中key和value都是User对象中的属性值。
  2. Map<String, String> userMap = users.stream().collect(Collectors.toMap(User::getId, User::getName))。
  3. Map中key为User对象的属性值,value为User对象。
  4. Map<String, User> userMap = users.stream().collect(Collectors.toMap(User::getId, User -> User))。
  5. 如果,我们的List中,key值重复,则会出现Duplicate key异常,这时候,我们可以使用覆盖的方式来避免这种异常。
  6. Map<String, User> userMap = users.stream().collect(Collectors.toMap(User::getId, Function.identity(), (oldVal, newVal) -> newVal))。
  7. Map中key为User对象的属性值,value为UserList。
  Map<String, User> userMap = users.stream().collect(Collectors.groupingBy(User::getId));
  filter
  1. list stream过滤数据
  2. List<User> filterUsers=users.stream().filter(item -> item.getName().equals("xxx")).collect(Collectors.toList());
  3. 去重过滤
  4. List<String> ids=new ArrayList<>(); List<User> distinctUsers=users.stream().filter(item->{ if(!ids.contains(item.getId())){ ids.add(item.getId()); return true; }else{ return false; } }).collect(Collectors.toList());
  5. stream有提供distinct去重的函数。
  sorted
  1 .按年龄升序排。
  List<User> sortUsers= users.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
  2.按年龄降序排。
  List<User> sortUsers= users.stream().sorted(Comparator.comparing(User::getAge).reversed()).collect(Collectors.toList());
  除了上面的一些函数外,还有功能强大的函数,如:limit、max、reduce等。
  Java Stream Debugger
  在我们使用Stream之后,调试是一个问题。
  在IDEA 2018后,会自带Java Stream Debugger这个插件,有助于我们更直观的了解Stream的执行过程。插件有了,我们该如何使用呢?
  1. 在需要调试Stream的地方,打上断点。
  2. debug模式启动后,在debug窗口中点击Trace Current Stream Chain
  我们可以点击切换上面每一步的tab,查看其执行的一个大致过程,我们也可以切换到Flat Mode模式。
  这里只是列举了几个常用的API,针对Stream的能力远比上面列举几个简单的功能要强大。
  本文内容不用于商业目的,如涉及知识产权问题,请权利人联系51Testing小编(021-64471599-8017),我们将立即处理
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号