我有两个类型为 List 的列表 list1 和 list2
Term{
long sId;
int rowNum;
long psid;
String name;
}
List<Term> list1 = new ArrayList<>();
List<Term> list2 = new ArrayList<>();
我想返回 list1 (list1.psid != list2.psid) 中的所有项目。
我尝试过,但它不起作用
public List<Term> getFilteredRowNum(List<Term> list1, List<Term> list2) {
List<Long> psid = list2.stream().map(x -> x.getPsid()).collect(Collectors.toList());
return list1.stream().filter(x -> !psid.contains(x.getPsid())).map(x -> x.getRowNum()+1).collect(Collectors.toList());
}
我想获取list1中满足以下条件的所有记录
if(列表1.psid!=列表2.psid)
Sample Date:
List1: rowNum psId name sid
1 1288 home 101
1 9012 home 101
2 1296 office 150
3 1290 park 161
List2: rowNum psId name sid
1 9012 home 101
2 1296 office 150
3 1290 park 161
List1 psId not in list2 so I am expecting fallowing list as result from list1
Expected: List1
rowNum psId name sid
1 1288 home 101
你正在寻找内心的anyMatch
在过滤谓词中为:
public List<Term> getFilteredRowNum(List<Term> termList1, List<Term> termList2) {
return termList1.stream()
.filter(term1 -> termList2.stream()
.anyMatch(term2 -> term1.getSId() == term2.getSId()
&& term1.getPsid() != term2.getPsid()))
.collect(Collectors.toList());
}
解决这个问题的另一种方法是创建一个Map
of sid
to a Set
of psid
s 存在于任何列表中,使用groupingBy
and mapping
Map<Long, Set<Long>> sIdToPsIdsMap = termList2.stream()
.collect(Collectors.groupingBy(Term::getSId,
Collectors.mapping(Term::getPsid, Collectors.toSet())));
并进一步将其用于filter
条件为
return termList1.stream()
.filter(term1 -> sIdToPsIdsMap.containsKey(term1.getSId())
&& !sIdToPsIdsMap.get(term1.getSId()).contains(term1.getPsid()))
.collect(Collectors.toList());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)