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
*