java使用stream判斷兩個list元素的屬性并輸出方式
使用stream判斷兩個list元素的屬性并輸出
/**
* 使用stream判斷兩個list中元素不同的item
*/
@Test
public void test1(){
List<Param> stringList1 = new LinkedList<Param>(){{
add(new Param(1,"1111"));
add(new Param(2, "2222"));
add(new Param(3, "3333"));
}};
List<Param> stringList2 = new LinkedList<Param>(){{
add(new Param(1,"1111"));
add(new Param(2, "4444"));
add(new Param(3, "5555"));
}};
// 判斷key相同,value相同的元素
Map<Integer, String> tmpList2 = stringList2.stream().collect(Collectors.toMap(Param::getId, Param::getName));
var tmplist = stringList1.stream().filter(item -> (tmpList2.get(item.getId()) != null && tmpList2.get(item.getId()).equals(item.getName()))).collect(Collectors.toList());
System.out.println(tmplist);
}
@Setter
@Getter
@ToString
@AllArgsConstructor
public static class Param{
private Integer id;
private String name;
}
/**
* 使用stream判斷兩個list中元素不同的item
*/
@Test
public void test1(){
List<Param> stringList1 = new LinkedList<Param>(){{
add(new Param(1,"1111", "b"));
add(new Param(2, "2222", "c"));
add(new Param(3, "3333", "a"));
}};
List<Param> stringList2 = new LinkedList<Param>(){{
add(new Param(1,"1111", "c"));
add(new Param(2, "4444", "b"));
add(new Param(3, "5555", "a"));
}};
// 判斷key相同,value相同的元素
Map<Integer, String> tmpList2 = stringList2.stream().collect(Collectors.toMap(Param::getId, Param::getName));
var tmplist = stringList1.stream().filter(item -> (tmpList2.get(item.getId()) != null && tmpList2.get(item.getId()).equals(item.getName()))).collect(Collectors.toList());
System.out.println(tmplist);
// 如果需要判斷多個值,直接將對象加入進去
Map<Integer, Param> tmpList3 = stringList2.stream().collect(Collectors.toMap(Param::getId, Function.identity()));
var tmplist2 = stringList1.stream().filter(item -> (tmpList3.get(item.getId()) != null && tmpList3.get(item.getId()).getType().equals(item.getType()))).collect(Collectors.toList());
System.out.println(tmplist2);
}
@Setter
@Getter
@ToString
@AllArgsConstructor
@EqualsAndHashCode
public static class Param{
private Integer id;
private String name;
private String type;
}
stream判斷列表是否包含某幾個元素/重復(fù)元素
(需求經(jīng)過修改過)判斷一個profile是否包含PROFILE-IN-A和PROFILE-IN-B且都是Enable=1打勾的.
既然已經(jīng)JDK8了,那就用lambda吧,如果是foreach可能比較難處理,用stream的filter則可以這樣做.
核心代碼可以這么寫
int intCheck = profileServiceDtoList.stream().filter(e ->
? ? ? ? ? ? "1".equals(e.getEnable())
? ? ? ? ? ? &&(("PROFILE-IN-MOSHOW".equals(e.getServiceIdentifier()))||("PROFILE-IN-ADC".equals(e.getServiceIdentifier()))) ?
? ? ).collect(Collectors.toList()).size();代碼SHOW
- 新建三個不同類型的profile,其中兩個是要判斷的,一個是干擾的.
- 通過steam進行filter,找出是否包含這兩個元素(相當于把要判斷的元素過濾進去)
- 判斷l(xiāng)ist的size大小(intCheck>1找到兩個則代表同時出現(xiàn))
public static void main(String[] args) {
? ? List<ProfileServiceDto> profileServiceDtoList= new ArrayList<>(3);
?? ?
? ? ProfileServiceDto profileService1 = new ProfileServiceDto();
? ? profileService1.setServiceId(1001L);
? ? profileService1.setServiceIdentifier("PROFILE-IN-MOSHOW");
? ? profileService1.setEnable("1");
? ? profileServiceDtoList.add(profileService1);
? ? ProfileServiceDto profileService2 = new ProfileServiceDto();
? ? profileService2.setServiceId(1002L);
? ? profileService2.setServiceIdentifier("PROFILE-IN-ADC");
? ? profileService2.setEnable("1");
? ? profileServiceDtoList.add(profileService2);
? ? ProfileServiceDto profileService3 = new ProfileServiceDto();
? ? profileService3.setServiceId(1003L);
? ? profileService3.setServiceIdentifier("PROFILE-XXX-ABC");
? ? profileService3.setEnable("1");
? ? profileServiceDtoList.add(profileService3);
? ? int intCheck = profileServiceDtoList.stream().filter(e ->
? ? ? ? ? ? "1".equals(e.getEnable())&&(("PROFILE-IN-MOSHOW".equals(e.getServiceIdentifier()))||("PROFILE-IN-ADC".equals(e.getServiceIdentifier())))
? ? ).collect(Collectors.toList()).size();
? ? System.out.println("intCheck->"+intCheck);
?? ?
?? ?if(intCheck>1){
?? ??? ?System.error.println("In one profile, cannot contain two more PROFILE-IN profile.");
?? ?}
}Java stream判斷列表是否包含重復(fù)元素
思路是通過一個distinct的list,然后跟原先的list來判斷大小,如果不一致(原先list.size>distinctList.size)則表示有重復(fù)元素
?? ??? ?//profileServiceDtoList路上,不累贅
?? ??? ?//多了一個profileService1.setGroupId("A");profileService1.setGroupId("B");profileService3.setGroupId("A");
?? ??? ?List<String> groupList = new ArrayList<>(4);
? ? ? ? profileServiceDtoList.stream().forEach(e -> {
? ? ? ? ? ? if ("Y".equals(e.getEnable()) && StringUtils.isNotEmpty(e.getGroupId())) {
? ? ? ? ? ? ? ? groupList.add(e.getGroupId());
? ? ? ? ? ? }
? ? ? ? });
? ? ? ? int distinctGroupSize = groupList.stream().distinct().collect(Collectors.toList()).size();
? ? ? ? if (groupList.size() > distinctGroupSize) {
? ? ? ? ? ? throw new ValidationException("100001","In one profile, the services with the same groupId cannot co-exist.");
? ? ? ? }以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot實現(xiàn)redis延遲隊列的示例代碼
延時隊列場景在我們?nèi)粘I(yè)務(wù)開發(fā)中經(jīng)常遇到,它是一種特殊類型的消息隊列,本文就來介紹一下SpringBoot實現(xiàn)redis延遲隊列的示例代碼,具有一定的參考價值,感興趣的可以了解一下2024-02-02
利用Java實體bean對象批量數(shù)據(jù)傳輸處理方案小結(jié)
javabean是對面向?qū)ο笏枷氲囊环N具體實施的表現(xiàn),本文重點給大家介紹利用Java實體bean對象批量數(shù)據(jù)傳輸處理方案小結(jié),本文通過兩種方案給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧2021-05-05
用SpringBoot+Vue+uniapp小程序?qū)崿F(xiàn)在線房屋裝修管理系統(tǒng)
這篇文章主要介紹了用SpringBoot+Vue+uniapp實現(xiàn)在線房屋裝修管理系統(tǒng),針對裝修樣板信息管理混亂,出錯率高,信息安全性差,勞動強度大,費時費力等問題開發(fā)了這套系統(tǒng),需要的朋友可以參考下2023-03-03
Java隊列同步器之CountDownLatch實現(xiàn)詳解
這篇文章主要介紹了Java隊列同步器之CountDownLatch實現(xiàn)詳解,CountDownLatch是一個同步工具類,它允許一個或多個線程一直等待,直到其他線程執(zhí)行完后再執(zhí)行,例如,應(yīng)用程序的主線程希望在負責(zé)啟動框架服務(wù)的線程已經(jīng)啟動所有框架服務(wù)之后執(zhí)行,需要的朋友可以參考下2023-12-12
通過java反射機制動態(tài)調(diào)用某方法的總結(jié)(推薦)
下面小編就為大家?guī)硪黄ㄟ^java反射機制動態(tài)調(diào)用某方法的總結(jié)(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-07-07
spring?boot?validation參數(shù)校驗與分組嵌套各種類型及使用小結(jié)
參數(shù)校驗基本上是controller必做的事情,畢竟前端傳過來的一切都不可信,validation可以簡化這一操作,這篇文章主要介紹了spring?boot?validation參數(shù)校驗分組嵌套各種類型及使用小結(jié),需要的朋友可以參考下2023-09-09

