美文网首页
引言 使用JDK1.8之后,大部分list的操作都可以使用lam

引言 使用JDK1.8之后,大部分list的操作都可以使用lam

作者: 啾啾1 | 来源:发表于2022-08-13 14:06 被阅读0次

    使用JDK1.8之后,大部分list的操作都可以使用lamada表达式去写,可以让代码更简洁,开发更迅速。以下是我在工作中常用的lamada表达式对list的常用操作,喜欢建议收藏。

    以用户表为例,用户实体代码如下:

    public class User { private Integer id; //id private String name; //姓名 private Integer age; //年龄 private Integer departId; //所属部门id}List<User> list = new ArrayList<>();

    简单遍历

    使用lamada表达式之前,如果需要遍历list时,一般使用增强for循环,代码如下:

    List list = new ArrayList<>();for (User u:list) {    System.out.println(u.toString());}

    使用lamada表达式之后,可以缩短为一行代码:

    list.forEach(u-> System.out.println(u.toString()));

    筛选符合某属性条件的List集合

    以筛选年龄在15-17之间的用户为例,for循环写法为:

    List users = new ArrayList<>();for (User u : list) {if (u.getAge() >= 15 && u.getAge() <= 17) {users.add(u);}}

    使用lamada表达式写法为:

    List users = list.stream()                          .filter(u -> u.getAge() >= 15 && u.getAge() <= 17)                          .collect(Collectors.toList());

    获取某属性返回新的List集合

    以获取id为例,项目中有时候可能会需要根据用户id的List进行查询或者批量更新操作,这时候就需要用户id的List集合,for循环写法为:

    List ids = new ArrayList<>();for (User u:list) {ids.add(u.getId());}

    lamada表达式写法为:

    List ids = list.stream()                          .map(User::getId).collect(Collectors.toList());

    获取以某属性为key,其他属性或者对应对象为value的Map集合

    以用户id为key(有时可能需要以用户编号为key),以id对应的user作为value构建Map集合,for循环写法为:

    Map userMap = new HashMap<>();for (User u:list) {if (!userMap.containsKey(u.getId())){userMap.put(u.getId(),u);}}

    lamada表达式写法为:

    Map map = list.stream()                                    .collect(Collectors.toMap(User::getId,                                      Function.identity(),                                    (m1,m2)->m1));

    Function.identity()返回一个输出跟输入一样的Lambda表达式对象,等价于形如t -> t形式的Lambda表达式。

    (m1,m2)-> m1此处的意思是当转换map过程中如果list中有两个相同id的对象,则map中存放的是第一个对象,此处可以根据项目需要自己写。

    以某个属性进行分组的Map集合

    以部门id为例,有时需要根据部门分组,筛选出不同部门下的人员,如果使用for循环写法为:

    Map> departGroupMap = new HashMap<>();for (User u:list) {if (departGroupMap.containsKey(u.getDepartId())){            departGroupMap.get(u.getDepartId()).add(u);}else {            List users1 = new ArrayList<>();            users1.add(u);            departGroupMap.put(u.getDepartId(),users1);}}

    使用lamada表达式写法为:

    Map> departGroupMap = list.stream()                                                                .collect(Collectors                                                                .groupingBy(User::getDepartId));

    其他情况

    可以根据需要结合stream()进行多个操作,比如筛选出年龄在15-17岁的用户,并且根据部门进行分组分组,如果使用for循环,代码如下:

    Map> departGroupMap = new HashMap<>();for (User u:list) {if (u.getAge() >= 15 && u.getAge() <= 17) {if (departGroupMap.containsKey(u.getDepartId())){departGroupMap.get(u.getDepartId()).add(u);}else {List users1 = new ArrayList<>();users1.add(u);departGroupMap.put(u.getDepartId(),users1);}}}

    使用lamada表达式,代码如下:

    Map> departGroupMap = list.stream()                                                              .filter(u->u.getAge() >= 15 && u.getAge() <= 17)                                                              .collect(Collectors.groupingBy(User::getDepartId));

    总结

    上述部分是小编在工作中遇到的常用的单个List的操作,可能在项目中还会遇到更复杂的场景,可以根据需要进行多个方法的组合使用,我的感觉是使用lamada表达式代码更加简洁明了,当然各人有各人的编码习惯,不喜勿喷。

    相关文章

      网友评论

          本文标题:引言 使用JDK1.8之后,大部分list的操作都可以使用lam

          本文链接:https://www.haomeiwen.com/subject/jneqgrtx.html