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

Java 如何根据内部列表的一个属性获取列表中唯一的元素,java,java-stream,Java,Java Stream,我需要根据内部列表的作业属性-name-获取列表中的唯一元素。因此,从下面的示例中,我希望结果列表中只有person/person3(我们删除person2,因为它具有相同的工作名称)。我只想在基于作业名称的列表中有唯一的元素 Person person = new Person("andri", "pik", Collections.singletonList(new Job("piotzr", 12))); Per

我需要根据内部列表的作业属性-name-获取列表中的唯一元素。因此,从下面的示例中,我希望结果列表中只有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;
}
Person-Person=newperson(“安德里”,“皮克”,收藏)。单音列表(newjob(“皮奥茨尔”,12));
Person person2=新人(“kotak”,“zik”,Collections.singletonList(新工作(“piotzr”,112));
Person person3=新人(“跛子”、“sri”、收藏品。单身人士名单(新工作(“piotra”,12));
公共阶层人士{
字符串名;
串姓;
列出工作;
}
公开课工作{
字符串名;
国际养老金;
}
另一个例子:我在名单上有3个人,其中两个人的名字是相同的。所以我想删除第二个人,因为它可能是重复的,在结果列表中,我只有两个人

我发现了类似于:

 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;
    }
私有谓词distinctByKey(函数键提取器){
Map seen=新的ConcurrentHashMap();
返回t->seen.putIfAbsent(keydextractor.apply(t),Boolean.TRUE)==null;
}

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

使用
您可以如下所示

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;
}
arraylistpersons=new ArrayList();
字符串requiredJobName=“”;
List filteredByJob=persons.stream()
.filter(person->hasJobWithName(person.job,requiredJobName))
.collect(Collectors.toList());
公共布尔hasJobWithName(列出作业,字符串名称){
for(职务:职务){
if(job.name.equals(name)){
返回true;
}
}
返回false;
}
您可以在过滤器中使用
anyMatch()

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

我不知道这个列表中会有哪些元素,我不能做类似的事情。equals(“piotra”)@traki111“…根据一个工作名称筛选列表中的元素…“你能给出一个具体的例子吗,你将使用什么进行搜索?编辑了我的问题。”。希望现在更清楚。我没有任何要求的工作名称。我只想根据工作的名字在列表中有唯一的元素。我想他想让同一个工作的人把名字放在一起,不能从问题中理解。@traki111所以你们想比较两个列表吗?它们应该有完全相同的元素来删除一个吗?或者,如何处理{“jobA”、“jobB”、“jobC”}和{“jobA”、“jobB”、“jobD”}工作列表?再次编辑我的问题。如果一个人在多个工作岗位工作,什么是唯一条目?假设人员1在工作1和工作2,人员2仅在工作1,人员3在工作3和工作2。在这种情况下,您希望得到什么样的输出?