java8根据某一属性过滤去重

前言

最近小编刚接触到java8特性,在不知道有java8特性的时候,一个for循环套一个for循环,自从接触大java8,为自己省了很多事,节省了很多代码量.

java8根据list某一属性去重

//根据id去重
examRoomModelLists = examRoomModelLists.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(
                // 利用 TreeSet 的排序去重构造函数来达到去重元素的目的
                // 根据firstName去重
                () -> new TreeSet<>(Comparator.comparing(ExamRoomModel::getId))), ArrayList::new));

java8过滤StudentExamState=0的数据

em.setNoLoginExamineeCount((examinee.stream().map(ExamineeEntity::getStudentExamState).filter(x -> 
x == 0).collect(Collectors.toList())).size());
            }

java8过滤ExamRoomStudentCount=0的数据

 List<ExamRoomModel> filterList = examRoomModelLists.stream().filter(ExamRoomModel -> 
 !Objects.equals(ExamRoomModel.getExamRoomStudentCount(), 0)).collect(Collectors.toList());
        

是不是很方便,换成以前过滤去重不知道要写多少横代码,现在一行解决.

### Java 8 中基于对象属性对 `List` 进行的最佳实践 在 Java 8 中,可以通过多种方式实现根据对象特定属性除 `List` 中的复元素。最常用的方式之是利用 Stream API 和 Lambda 表达式的组合。 #### 使用 Stream API 及 Collectors.toMap() 通过使用 `Collectors.toMap()` 方法可以有效地按照指定键(即对象中的某个字段)进行分组,并自动处理冲突情况: ```java import java.util.*; import java.util.stream.Collectors; class User { private String name; private int age; public User(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return "User{name='" + name + "', age=" + age + '}'; } // Getters and setters... } public class Main { public static void main(String[] args) { List<User> users = Arrays.asList( new User("Alice", 30), new User("Bob", 25), new User("Alice", 35), // Duplicate by name but different ages. new User("Charlie", 40)); Map<String, User> uniqueUsersByName = users.stream() .collect(Collectors.toMap(User::getName, user -> user, (existing, replacement) -> existing)); // Conflict resolution strategy. System.out.println(uniqueUsersByName.values()); } } ``` 这段代码会保留第次遇到的对象实例作为唯代表[^1]。 #### 利用 `distinct()` 结合自定义比较器 另种方法是在流操作中加入过滤逻辑,先映射到需要判断唯属性上再调用 `distinct()` 函数完成筛选工作: ```java import java.util.*; import java.util.stream.Collectors; // Assuming we have a similar 'User' class definition here... public class DistinctByPropertyExample { public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { Set<Object> seen = ConcurrentHashMap.newKeySet(); return t -> seen.add(keyExtractor.apply(t)); } public static void main(String[] args) { List<User> users = ... ; // Initialize your list of Users List<User> result = users.stream().filter(distinctByKey(User::getName)).toList(); System.out.println(result); } } ``` 这种方法更加灵活通用,适用于任何类型的实体类以及任意数量的关键字匹配条件[^2]。 #### 性能考量与注意事项 当数据量较大时,上述两种解决方案都能提供良好的性能表现;然而,在实际应用开发过程中还需要考虑内存占用等因素的影响。如果目标集合非常庞大,则可能需要探索更为高效的算法或者采用分布式计算框架来进行大规模数据集上的相似度分析任务。 另外值得注意的是,无论是哪种方式都需要确保所选作区分依据的那个成员变量具备稳定的哈希码生成机制,这样才能保证程序运行期间的致性和准确性[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值