Java 将对象变量从列表匹配并设置为不同的对象列表

Java 将对象变量从列表匹配并设置为不同的对象列表,java,foreach,collections,java-8,java-stream,Java,Foreach,Collections,Java 8,Java Stream,试图找出将列表中的对象变量与列表中不同类型的对象变量相匹配的最佳方法。一旦找到匹配项,我想在第一个对象中设置一个不同的变量,使其与另一个对象变量匹配。最好的解释方式如下: 我有一个猫列表,猫有变量id、大小、品种、名称、vetId和vetName 我还有一个列表,列出了兽医,兽医有变量id、地址、电话和姓名 cats列表有一个vetId,但vetName为空,我需要从vets列表中添加名称 我需要一个快速有效的方法来做这件事。我对Java 8的新功能不是很熟练,但我相信有一种快速的方法可以做到这

试图找出将列表中的对象变量与列表中不同类型的对象变量相匹配的最佳方法。一旦找到匹配项,我想在第一个对象中设置一个不同的变量,使其与另一个对象变量匹配。最好的解释方式如下:

我有一个猫列表,猫有变量id、大小、品种、名称、vetId和vetName

我还有一个
列表,列出了兽医
,兽医有变量id、地址、电话和姓名

cats
列表有一个vetId,但vetName为空,我需要从
vets
列表中添加名称

我需要一个快速有效的方法来做这件事。我对Java 8的新功能不是很熟练,但我相信有一种快速的方法可以做到这一点。

使用地图

public void setCatVetNames(Collection<Cat> cats, Collection<Vet> vets) {
    Map<String, String> map= new HashMap<>(vets.size());
    for (Vet vet : vets) map.put(vet.getId(), vet.getName());
    for (Cat cat : cats) cat.setVetName(map.get(cat.getVetId()));
}
public void setCatVetNames(收集猫、收集猫){
Map Map=newhashmap(vets.size());
for(Vet-Vet:vets)map.put(Vet.getId(),Vet.getName());
对于(Cat:cats)Cat.setVetName(map.get(Cat.getVetId());
}

代码应该是相当自解释的,但基本上是:创建一个从vet ID到vet名称的映射(我假设ID是字符串,如果它们是INT,则更改为
Map
),然后填充映射,并使用地图设置猫的兽医名称。

您可以通过一个简单的过滤器来实现这一点,同时为每只
猫的
列表

public static void main(String[] args) {
    // create some sample data
    List<Cat> cats = new ArrayList<>();
    List<Vet> vets = new ArrayList<>();

    cats.add(new Cat(1, 25, "Persian", "Kitty", 123, ""));
    cats.add(new Cat(2, 25, "Persian", "Pussy", 321, ""));
    cats.add(new Cat(3, 150, "African Lion", "Simba", 231, ""));
    cats.add(new Cat(4, 160, "Indian Tigre", "Shir Khan", 213, ""));
    cats.add(new Cat(5, 120, "Pantera", "Pantera", 123, ""));

    vets.add(new Vet(123, "Somewhere Road 123", "555-SHOE", "Dr. Bundy"));
    vets.add(new Vet(321, "Vegas Boulevard 69", "216-WHITETIGERS", "Dr. Siegfried"));
    vets.add(new Vet(231, "Baker Street 150", "150-MORIARTY", "Dr. Watson"));
    vets.add(new Vet(213, "Mulholland Drive 1", "321-NOIDEA", "Dr. Lynch"));

    // find out the names of the vets for each cat:
    cats.forEach(cat -> {
        Vet v = vets.stream()
                // filter by id
                .filter(vet -> vet.getId() == cat.getVetId())
                // receive the first result
                .findFirst()
                // or set the result to null if no vet for the vetId of the cat was found
                .orElse(null);
        // check if v isn't null here, in this example it won't be, so I omitted the check...

        // then print the results
        System.out.println(cat.getName() + " gets its treatment from " + v.getName());
    });
}
publicstaticvoidmain(字符串[]args){
//创建一些示例数据
列表猫=新的ArrayList();
List vets=new ArrayList();
加上(新猫(1,25,“波斯语”,“小猫”,123“));
添加(新猫(2,25,“波斯猫”,“猫咪”,321“));
添加(新猫(3150只,“非洲狮”,“辛巴”,231“));
加上(新的猫(4160,“印度虎”,“Shir Khan”,213“);
添加(新的Cat(5120,“Pantera”,“Pantera”,123“));
兽医添加(新兽医(123,“某处路123”,“555-鞋”,“邦迪医生”);
新增兽医(新兽医(321,“维加斯大道69号”、“216-白虎队”、“西格弗里德医生”);
新增兽医(新兽医(231,“贝克街150号”、“莫里亚蒂150号”、“沃森医生”);
新增兽医(新兽医(213名,“Mulholland Drive 1”、“321-NOIDEA”、“林奇医生”);
//找出每只猫的兽医姓名:
猫。forEach(猫->{
Vet v=vets.stream()
//按id筛选
.filter(vet->vet.getId()==cat.getVetId())
//收到第一个结果
.findFirst()
//或者,如果未找到猫的vetId的vet,则将结果设置为null
.orElse(空);
//在这里检查v是否不为null,在本例中它不会为null,因此我省略了检查。。。
//然后打印结果
System.out.println(cat.getName()+”从“+v.getName()”获取其处理);
});
}
请注意,我不得不猜测
Cat
Vet
中类属性的类型,因为您在问题中没有提到它们


假设您有两个列表
列出猫
列出兽医

您可以使用Stream API实现所需的功能:

// Build map of (vetId -> vetName) pairs
Map<Long, String> vetMap = vets.stream().collect(toMap(Vet::getId, Vet::getName));
// Update cats with proper vet names
cats.forEach(cat -> cat.setVetName(vetMap.get(cat.getVetId())));
//构建(vetId->vetName)对的映射
Map vetMap=vets.stream().collect(toMap(Vet::getId,Vet::getName));
//用正确的兽医名字更新猫
cat.forEach(cat->cat.setVetName(vetMap.get(cat.getVetId()));

您试过什么吗?您能展示一下上面提到的两个类吗?我的意思是
Vet
Cat
。。。如果你试过什么,请也展示一下。@deHaar这些课程都是直截了当的。虽然他们没有任何意义,因为作者似乎并没有尝试过任何东西。@Stefza你们要求的是一种快速有效的方法。你能先把你的方法贴出来吗?因此,社区可以帮助指导您。@ETO他们是直截了当的吗?例如,我看不到有关属性类型的信息,也不会对地址使用简单的
字符串。身份证呢?它是
int
还是
long
甚至是
字符串
?但总的来说,你是对的,可以这样做,但没有付出任何努力。这就是我想要的,只是删除
System.out.println()
,并将其替换为
cat.setVetName(v.getName())此解决方案无法执行。最坏的情况是
O(n*m)
,其中
n
是猫的数量,
m
是兽医的数量。这个解决方案回答得很好。