如何根据内部列表的一个属性获得列表中唯一的元素



我需要根据内部列表的作业属性-名称获得列表中的唯一元素。因此,从下面的例子中,我希望在结果列表中只有person/person3(我们删除person2,因为它具有相同的工作名称)。我只是想在列表中有基于作业名称的唯一元素。

Person person = new Person("andri", "pik", Collections.singletonList(new Job("piotzr", 12)));
Person person2 = new Person("kotak", "zik", Collections.singletonList(new Job("piotzr", 112)));
Person person3 = new Person("lame", "sri", Collections.singletonList(new Job("piotra", 12)));
public class Person {
String name;
String surname;
List<Job> job;

}
public class Job {
String name;
int pension;
}

另一个例子:我的列表中有3个人,其中2个人有相同的工作名称。因此,我想删除第二个人,因为它可能会重复,在结果列表中,我将只有2个人

我找到了这样的东西:

private <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
Map<Object, Boolean> seen = new ConcurrentHashMap<>();
return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
}

但是它只涉及迭代列表的属性,我不知道如何进入内部并基于它收集上列表的元素。

使用streams,你可以这样做

ArrayList<Person> persons = new ArrayList<>();
String requiredJobName = "";
List<Person> filteredByJob = persons.stream()
.filter(person -> hasJobWithName(person.job, requiredJobName))
.collect(Collectors.toList());

public boolean hasJobWithName(List<Job> jobs, String name){
for(Job job : jobs){
if(job.name.equals(name)){
return true;
}
}
return false;
}

可以在过滤器中使用anyMatch():

Person output = list.stream().filter(p -> p.getJob().stream().anyMatch(j -> j.getName().equals("piotra")))
.findFirst().get();

最新更新