java 集合常用操作和使用技巧

655 阅读3分钟

1、实体类如下:

import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDate;

@Data
@NoArgsConstructor
public class Student {

   private String name;
   
   private Integer age;
   
   private LocalDate date;
   
   public Student(String name, Integer age) {
      this.name = name;
      this.age = age;
   }
   
   public Student(String name, Integer age, LocalDate date) {
      this.name = name;
      this.age = age;
      this.date = date;
   }
   
   @Override
   public String toString() {
      return "Student{" +
            "name='" + name + ''' +
            ", age=" + age +
            ", date=" + date +
            '}';
   }
}

2、构造集合

public static List<Student> initData() {
   List<Student> students =CollUtil.newArrayList();
   students.add(new Student("1",21));
   students.add(new Student("2",null));
   students.add(new Student("3",null));
   students.add(new Student("4",24));
   students.add(new Student("5",null));
   students.add(new Student("6",25));
   students.add(new Student("7",null));
   return students;
}

3、获取集合的name属性集合

3.1 stream map方法

List<Student> students = initData();

List<String> names = students.stream().map(Student::getName).collect(Collectors.toList());

System.out.println(names);

输出如下:

[1, 2, 3, 4, 5, 6, 7]

3.2 使用 Hutool CollUtil.getFieldValues

List<Student> students = initData();
List<String> names = CollUtil.getFieldValues(students, "name", String.class);
System.out.println(names);

输出如下:

[1, 2, 3, 4, 5, 6, 7]

4、按照条件过滤子集合

4.1 stream filter 过滤器

List<Student> students = initData();

List<Student> subStudents = students.stream().filter((s) -> s.getAge() != null).collect(Collectors.toList());

System.out.println(subStudents);
System.out.println(students.size());

输出如下:

[Student{name='1', age=21, date=null}, Student{name='4', age=24, date=null}, Student{name='6', age=25, date=null}]

7

4.2 使用Hutool CollUtil.filterNew

注意: hutool CollUtil.filter 会直接操作原集合,对于 filterNew 其性能也不如 stream filter 好,filterNew 为了不影响原集合使用了拷贝处理

List<Student> students = initData();

Collection<Student> subStudents = CollUtil.filterNew(students, (s) -> s.getAge() != null);

System.out.println(subStudents);
System.out.println(students.size());

输出如下:

[Student{name='1', age=21, date=null}, Student{name='4', age=24, date=null}, Student{name='6', age=25, date=null}]

5、把集合转化为Map

这样便于 后续根据 name 来查询 student。

5.1 使用 Collectors.toMap

List<Student> students = initData();

Map<String,Student> studentMap = students.stream()
.collect(Collectors.toMap(Student::getName, Function.identity()));

System.out.println(studentMap);

输出如下:

{1=Student{name='1', age=21, date=null}, 2=Student{name='2', age=null, date=null}, 3=Student{name='3', age=null, date=null}, 4=Student{name='4', age=24, date=null}, 5=Student{name='5', age=null, date=null}, 6=Student{name='6', age=25, date=null}, 7=Student{name='7', age=null, date=null}}

使用 Collectors.toMap 如果 name 有多个相同的值,默认会抛出异常

5.2 使用Hutool CollUtil.fieldValueMap

List<Student> students = initData();

Map<String,Student> studentMap = CollUtil.fieldValueMap(students,"name");

System.out.println(studentMap);

输出如下:

{1=Student{name='1', age=21, date=null}, 2=Student{name='2', age=null, date=null}, 3=Student{name='3', age=null, date=null}, 4=Student{name='4', age=24, date=null}, 5=Student{name='5', age=null, date=null}, 6=Student{name='6', age=25, date=null}, 7=Student{name='7', age=null, date=null}}

使用 CollUtil.fieldValueMap 如果 name 有多个相同的值 ,会进行覆盖操作,以最后一个值为准。

6、修改集合中的值

把集合中的age == null 的都改为 0

6.1 循环处理

List<Student> students = initData();


for (Student student : students) {
   if (student.getAge() == null) {
      student.setAge(0);
   }
}

System.out.println(students);

输出如下:

[Student{name='1', age=21, date=null}, Student{name='2', age=0, date=null}, Student{name='3', age=666, date=null}, Student{name='4', age=24, date=null}, Student{name='5', age=0, date=null}, Student{name='6', age=25, date=null}, Student{name='7', age=0, date=null}]

6.2 使用 Hutool CollUtil.edit

List<Student> students = initData();


CollUtil.edit(students, t -> {
   if (t.getAge() == null) {
      t.setAge(0);
   }
   return t;
});

System.out.println(students);

输出如下:

[Student{name='1', age=21, date=null}, Student{name='2', age=0, date=null}, Student{name='3', age=666, date=null}, Student{name='4', age=24, date=null}, Student{name='5', age=0, date=null}, Student{name='6', age=25, date=null}, Student{name='7', age=0, date=null}]

7、集合的其他操作

7.1 集合并集 Hutool CollUtil.union

* 两个集合的并集<br>
* 针对一个集合中存在多个相同元素的情况,计算两个集合中此元素的个数,保留最多的个数<br>
* 例如:集合1[a, b, c, c, c],集合2[a, b, c, c]<br>
* 结果:[a, b, c, c, c],此结果中只保留了三个c

7.2 多个集合的非重复并集 Hutool CollUtil.unionDistinct

* 多个集合的非重复并集,类似于SQL中的“UNION DISTINCT”<br>
* 针对一个集合中存在多个相同元素的情况,只保留一个<br>
* 例如:集合1[a, b, c, c, c],集合2[a, b, c, c]<br>
* 结果:[a, b, c],此结果中只保留了一个c

7.3 多个集合的完全并集 Hutool CollUtil.unionAll

/**
 * 多个集合的完全并集,类似于SQL中的“UNION ALL”<br>
 * 针对一个集合中存在多个相同元素的情况,保留全部元素<br>
 * 例如:集合1[a, b, c, c, c],集合2[a, b, c, c]<br>
 * 结果:[a, b, c, c, c, a, b, c, c]
 *

7.4 两个集合的交集 CollUtil.intersection

/**
 * 两个集合的交集<br>
 * 针对一个集合中存在多个相同元素的情况,计算两个集合中此元素的个数,保留最少的个数<br>
 * 例如:集合1[a, b, c, c, c],集合2[a, b, c, c]<br>
 * 结果:[a, b, c, c],此结果中只保留了两个c
 *