在日常的開發中,經常會碰到對數據庫查出來的數據還要進行二次的業務邏輯處理的情況,有時候需要對一個對象集合中的重複的元素進行剔除. 下面是一個demo. 可以找出對象List中,某個屬性重複的值.
public class StreamTest {
public static void main(String[] args) {
ArrayList<Bean> list = new ArrayList<>();
Bean b1 = new Bean("200021", "張三", "男");
Bean b2 = new Bean("200025", "李四", "女");
Bean b3 = new Bean("200023", "王二麻子", "男");
Bean b4 = new Bean("200021", "狗蛋", "男");
Bean b5 = new Bean("200026", "哈皮", "女");
CollectionUtils.addAll(list,b1,b2,b3,b4,b5);
List<String> repeatCode = list.stream().collect(Collectors.groupingBy(Bean::getCode, Collectors.counting())).entrySet().stream().filter(entry -> entry.getValue() > 1).map(Map.Entry::getKey).collect(Collectors.toList());
System.out.println("repeatCode = " + repeatCode);
System.out.println("list = " + list);
if (CollectionUtils.isNotEmpty(repeatCode)) {
repeatCode.forEach(merId -> extractRepeat(list, merId));
}
System.out.println("list = " + list);
}
public static void extractRepeat( List<Bean> compInfos, String repeatCode) {
Optional<Bean> first = compInfos.stream().filter(o -> o.getCode().equals(repeatCode)).findFirst();
if (first.isPresent()) {
Bean bean = first.get();
compInfos.removeIf(next -> next.getCode().equals(repeatCode));//先將所有符合這個重複的code的對象從源集合中刪除.
compInfos.add(bean);//再將取出來的第一個添加進去.
}
}
}
@AllArgsConstructor
@Data
class Bean{
String code;
String name;
String sex;
}
講解
上述repeatCode中的就是list中所有Bean中重複的code.
Collectors.groupingBy(Bean::getCode, Collectors.counting()) 這段代碼的作用就是統計每個Code出現的次數.展開的完整寫法爲
for (Bean bean : list) {
map.merge(bean.getCode(), 1L, Long::sum);
}
然後通過Stream的filter將出現次數大於1的值放到list中.最後就是通過遍歷將集合中所有code等於重複code的對象剔除.然後
再加入一個需要的對象.就完成了剔除某一個值重複的對象.