當我們在處理業務的時候,很多情況下數據都要進行一層層的過濾,最近需要給一個列表中去除不符合條件的元素,
本來覺着挺簡單的,Google了下發現很多方法都是舊方法,根本不符合我的需求。
於是參考着網上的方法自己寫了幾個方法
1 .Iterator 去除
Iterator<AdmVipConfigs> iterator = admVipConfigs.iterator();
while (iterator.hasNext()){
AdmVipConfigs next = iterator.next();
String vipName1 = next.getVipName();
if (vipName1.equals("鉑金會員")){
iterator.remove();
}
}
雖然也能去除 但是列表改造成 Iterator 類型的了 (還要轉換 不喜歡 )
這不太符合我的代碼風格 先pass
又換了幾種比較舊的轉換方式 發現缺陷都不小(麻煩)
這時候不能再跟着舊思路走了 必須自己想個好方法了
這時候突然就想起了流 雖然用的不多 但是很喜歡這種風格
用流怎么處理這個問題呢
不用說肯定先Google
然后發現流確實能處理 而且更強大(好看)
2 stream 去除
admVipConfigs.stream().findFirst().map(vo -> {
if (vo.getVipName().equals("注冊會員")){
admVipConfigs.remove(vo);
}
return vo;
});
沒有改變我的list格式並且更簡潔,看着還是比較滿意的
但是流處理的時候remove的時候會再次遍歷整個list來找出
這個元素,性能會有一定的損耗,這怎么能行,我肉眼能看到的
損耗都是垃圾代碼(除非沒時間改)
既然這樣 我們只能給它加個索引了
3 stream + 索引 去除
IntStream.range(0,admVipConfigs.size()).filter(i->
admVipConfigs.get(i).getVipName().equals("金卡會員")).
boxed().findFirst().map(i->admVipConfigs.remove((int)i));
其中boxed為裝箱操作
好像又簡潔了點,沒錯 要的就是這個了!
// 去除list中的某一個元素 @Test public void bb(){ String vipName[] = {"注冊會員", "金卡會員", "鉑金會員", "鑽石會員", "至尊會員", "超級會員"}; List<AdmVipConfigs> admVipConfigs=new ArrayList<>(); for (int i = 1; i < 7; i++) { AdmVipConfigs admVipConfig = new AdmVipConfigs(); admVipConfig.setVipId(i); admVipConfig.setVipDel(0); admVipConfig.setVipDefaultValue(0); admVipConfig.setVipOrderNo(i); if (i == 1) { admVipConfig.setVipStatus(0); } else { admVipConfig.setVipStatus(1); } admVipConfig.setVipCondition(0); admVipConfig.setVipName(vipName[i - 1]); admVipConfigs.add(admVipConfig); } admVipConfigs.stream().findFirst().map(vo -> { if (vo.getVipName().equals("注冊會員")){ admVipConfigs.remove(vo); } return vo; }); IntStream.range(0,admVipConfigs.size()).filter(i-> admVipConfigs.get(i).getVipName().equals("金卡會員")).boxed().findFirst().map(i->admVipConfigs.remove((int)i)); Iterator<AdmVipConfigs> iterator = admVipConfigs.iterator(); while (iterator.hasNext()){ AdmVipConfigs next = iterator.next(); String vipName1 = next.getVipName(); if (vipName1.equals("鉑金會員")){ iterator.remove(); } } System.out.println(admVipConfigs); }
