Сопоставление и установка переменной объекта из списка в другой список объектов - PullRequest
3 голосов
/ 04 октября 2019

Попытка выяснить лучший способ сопоставления переменной Objects, которая находится в списке, с другим типом Object Variable в списке. Как только совпадение найдено, я бы хотел установить другую переменную в этом первом объекте в другую переменную объекта, с которой он совпал. Лучший способ объяснить это было бы так:

У меня есть List<Cat> cats, а у cat есть переменные id, size, breed, name, vetId и vetName.

У меня также естьList<Vet> vets и ветеринары имеют переменные id, address, phone и name.

В списке cats есть vetId, но vetName имеет значение null, мне нужно как-то добавить имя из списка vets.

Мне нужен быстрый и эффективный способ сделать это. Я не настолько квалифицирован с новыми вещами Java 8, но я уверен, что это будет быстрый способ сделать это.

Ответы [ 3 ]

3 голосов
/ 04 октября 2019

Если у вас есть два списка List<Cat> cats и List<Vet> vets

Вы можете достичь того, что вам нужно, используя 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())));
1 голос
/ 04 октября 2019

Используйте карты.

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()));
}

Код должен быть достаточно понятен, но в основном: создайте отображение из идентификаторов ветеринаров в имена ветеринаров (я предполагаю, что идентификаторы являются строками, если они являются целыми числами, измените на Map<Integer, String>), затем заполните карту и используйте карту для задания имен ветеринаров для кошек.

0 голосов
/ 04 октября 2019

Вы можете сделать это с помощью простого фильтра во время потоковой передачи List<Vet> для каждого Cat:

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());
    });
}

Обратите внимание, что мне пришлось угадывать типы атрибутов класса в Cat и Vet, потому что вы не упомянули их в своем вопросе.

...