设置和问题
我在一个简单的 Java 数据类上有一个流,例如:
class Candidate{
private Long id;
private String fullName;
private String job;
private String adress;
}
我想通过两个属性过滤我的流:job
adress
"Italy"
不管 job
例子
考虑一个示例数据集,如
ID
全名
工作
地址
1
彼得·布莱特
IT工程师
意大利
2
帕特里克·马农
电子工程师
西类牙
3
鲍勃·吉娜
IT工程师
瑞士
4
亚历山大·拉约
安全工程师
英国
或在 Java 中:
Candidate c1 = new Candidate(1,"Peter Bright","IT Engineer","Italy");
Candidate c2 = new Candidate(2,"Patrick Manon","Electronics engineer","Spain");
Candidate c3 = new Candidate(3,"Bob Jina","IT Engineer","Suisse");
Candidate c4 = new Candidate(4,"Alexander Layo","Security Engineer","UK");
Stream<Candidate> candidates = Stream.of(c1, c2, c3, c4);
我想以结果为的方式过滤流:ID
全名
工作
地址
1
彼得·布莱特
IT工程师
意大利
2
帕特里克·马农
电子工程师
西类牙
4
亚历山大·拉约
安全工程师
英国
请注意
Bob Jina
自 IT Engineer
起被移除已经在那里了。如果有来自意大利的重复候选人,我们需要保留所有候选人
最佳答案
您可以 Collection 到 Candidate
的 map s,使用 job
作为关键并在发生冲突时保留意大利候选人:
Collection<Candidate> result = candidates.stream()
.collect(Collectors.toMap(
Candidate::getJob,
Function.identity(),
(c1, c2) -> "italy".equalsIgnoreCase(c1.getAddress()) ? c1 : c2,
LinkedHashMap::new))
.values();
这使用了 Collectors.toMap
的过载接受四个参数。我正在收集到
LinkedHashMap
保留插入顺序。此解决方案在
Collection
中返回候选者, 如果您需要 List
,从集合中创建它:List<Candidate> list = new ArrayList<>(result);
关于java - 流按属性不同但被另一个属性排除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68866003/