java8 多条件过滤、去重

本文介绍了如何使用Java8进行多条件过滤,通过示例展示了针对sms.getCorpcode()、sms.getBltype()和sms.getSvrtype()三个条件的过滤操作。同时,也分享了多条件分组的方法,包括先按bltype分组,再按corpcode分组,以实现对数据的精细化管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、java8多条件过滤事例:

// 筛选短信黑名单数据
List<PbListBlack> smsBlackListSet = allBlacklist.stream().filter(sms -> (sms.getCorpcode().equals(corpCode) &&
        sms.getBltype().equals(MessageTypeEnum.SMS.getKey()) && sms.getSvrtype().equals(bus))).collect(Collectors.toList());

// 解释:本次对allBlacklist集合过滤条件三个:sms.getCorpcode(),sms.getBltype(),sms.getSvrtype()。

              过滤判断条件是布尔类型的,所以多个条件的连接需要用&&(与) 、|| (或)连接符连接起来。最后筛选出符合条件的数据。

 

 

2、java8多条件分组事例:

// 对黑名单根据corpcode 和 bltype进行分组
 Map<String,Map<Integer,List<PbListBlack>>> smsBlackListMap = allBlacklist.stream().collect(Collectors.groupingBy(PbListBlack::getCorpcode,Collectors.groupingBy(PbListBlack::getBltype)));

// 解析:bltype为Integer类型,corpcode为String类型。

               我们处理方式,1.先用bltype进行分组,得到一个Map<Int

### Java 集合过滤 #### 单元素 对于简单的单元素集合,可以采用 `Set` 来自动复项。由于 `Set` 接口不允许存储复元素,因此当把列表转换成集合并再转回列表时,就实现了的效果。 ```java import java.util.*; public class SingleElementDistinct { public static void main(String[] args) { List<Integer> list = Arrays.asList(1, 3, 5, 2, 1, 3, 7, 2); Set<Integer> set = new HashSet<>(list); System.out.println("后的集合:" + set); } } ``` 另一种方式是在Java 8中使用 Stream API 结合 `distinct()` 方法来完成相同的操作[^3]: ```java List<Integer> distinctElements = list.stream().distinct().collect(Collectors.toList()); System.out.println("后的集合:" + distinctElements); ``` #### 实体类对象 针对包含多个字段的对象类型的集合,可以通过覆盖 `equals()` 和 `hashCode()` 方法让这些对象能够被正确识别为相等从而达到的目的。之后同样可借助于 `HashSet` 或者 `Stream.distinct()` 这样的工具来进行处理[^1]。 假设有一个名为 `Person` 的实体类,其中有两个主要属性——名字 (`name`) 和年龄 (`age`) ,为了基于这两个属性进行比较并实现,则可以在该类内部定义上述两个方法: ```java @Override public boolean equals(Object o){ if (this == o) return true; if (!(o instanceof Person)) return false; Person person = (Person)o; return age == person.age && Objects.equals(name,person.name); } @Override public int hashCode(){ return Objects.hash(name, age); } ``` 接着就可以像下面这样轻松地对 `Person` 对象组成的集合执行操作了: ```java List<Person> peopleWithDuplicates = ... ;//初始化含有复数据的人群列表 Set<Person> uniquePeople = new HashSet<>(peopleWithDuplicates); //或者使用stream api的方式 List<Person> uniquePeopleViaStream = peopleWithDuplicates.stream() .distinct() .collect(Collectors.toList()); ``` #### 根据特定属性 如果只需要依据某些具体属性而非全部属性来做判断的话,那么还可以考虑先将目标属性提取出来形成键值映射表(Map),然后再从中获取唯一的记录条目;或者是直接利用流式编程模型中的各种中间操作符如 `filter`, `sorted`, 等配合自定义逻辑达成目的[^2]。 例如要按照人的姓名这一单一属性做筛选: ```java // 使用 Map 除同名人员 Map<String, Person> mapByName = new LinkedHashMap<>(); for(Person p : peopleWithDuplicates){ mapByName.merge(p.getName(),p,(existing,newOne)-> existing); } List<Person> resultByNames = new ArrayList<>(mapByName.values()); // 或者更简洁地用 stream api 完成同样的事情 resultByNames = peopleWithDuplicates.stream() .collect(Collectors.toMap( Person::getName, Function.identity(), (existing, replacement) -> existing)) .values() .stream() .collect(Collectors.toList()); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值