集合根据对象的属性去重
list集合对象根据属性去重
今天需要批量插入数据库的时候,需要根据一些字段进行去重,以防添加重复数据
实体类
@Data
@RequiredArgsConstructor(staticName = "of")
@Accessors(chain = true)
public class User {
private String name;
private Integer age;
private Date birthday;
}
测试方法如下:
public class ListTest {
private List<User> list = new LinkedList<>();
@Before
public void method00() {
Date date = new Date();
list.add(User.of().setName("张三").setAge(11).setBirthday(date));
list.add(User.of().setName("李四").setAge(15).setBirthday(date));
list.add(User.of().setName("王五").setAge(18).setBirthday(date));
list.add(User.of().setName("王五").setAge(18).setBirthday(date));
list.add(User.of().setName("张三").setAge(21).setBirthday(date));
}
@Test
public void method01() {
//根据属性值进行去重
//方式1 使用匿名内部类
Set<User> users = new TreeSet<>(new Comparator<User>() {
@Override
public int compare(User user1, User user2) {
//根据name进行去重
return user1.getName().compareTo(user2.getName());
//根据name以及age进行去重
//return (user1.getName() + user1.getAge()).compareTo(user2.getName() + user2.getAge());
}
});
users.addAll(list);
for (User user : users) {
System.out.println("user = " + user);
}
}
@Test
public void method02() {
//方式2 使用lambda 根据name以及age进行去重
Set<User> users = new TreeSet<>(Comparator.comparing(user -> (user.getName() + user.getAge())));
//根据name进行去重
// Set<User> users = new TreeSet<>(Comparator.comparing(User::getName));
users.addAll(list);
for (User user : users) {
System.out.println("user = " + user);
}
}
@Test
public void method03() {
//方式3 使用lambda:方式二 根据name以及age进行去重
List<User> collect = list.stream().collect(Collectors.collectingAndThen(
Collectors.toCollection(
() -> new TreeSet<>(Comparator.comparing(user -> user.getName() + user.getAge()))),
ArrayList::new));
//方式3 使用lambda:方式二 根据name进行去重
List<User> collect1 = list.stream().collect(Collectors.collectingAndThen(
Collectors.toCollection(
() -> new TreeSet<>(Comparator.comparing(User::getName))),
ArrayList::new));
for (User user : collect) {
System.out.println("user = " + user);
}
}
}