Создать список элемента объекта из другого списка объектов - PullRequest
1 голос
/ 12 июня 2019

Модель:

public class MyModel{
    private int id;
    private String name;
    ....
    ....
    //getters and setters
}

У меня есть список MyModel объекта:

//First Object to be added to list
MyModel myModelObject1 = new MyModel();
myModelObject1.setId(1);
myModelObject1.setName("abc");

//Second Object to be added to list
MyModel myModelObject2 = new MyModel();
myModelObject1.setId(2);
myModelObject1.setName("pqr");

List<MyModel> myModelList = new ArrayList<MyModel>();
myModelList.add(myModelObject1);
myModelList.add(myModelObject2);

Я хочу получить список имен, присутствующих в списке MyModel, т.е.Я хочу создать список имен (List<String> в данном случае) из myModelList.Итак, я хочу, чтобы мой список имел:

{"abc", "pqr"}

Всегда есть способ выполнить итерацию и создать другой список, но есть ли лучший способ сделать это?(Не обязательно быть эффективным, но если это можно сделать в строке с использованием потоков, foreach и т. Д.).

РЕДАКТИРОВАТЬ: ответы сработали для меня, но у меня есть некоторые изменения в моем случае использования: если я хочу добавитьусловие, что только имя, которое содержит символ 'a', должно быть добавлено в список, и я хочу добавить сообщение журнала для отладки для каждого элемента, тогда как мне подходить к этому?

Я попытался сделать следующее, используяметод (charAPresent()), который проверяет, что если переданная строка содержит символ «а», но он не работает:

List<String> modelNameList = myModelList.stream()
        .map(model -> {
            if (charAPresent(model.getName)) {
                model.getName() 
            }
        })
        .collect(Collectors.toList());

Дайте мне знать, если я что-то упустил.

Ответы [ 4 ]

1 голос
/ 12 июня 2019

Вы можете использовать Stream.map(), чтобы получить только названия вашей модели.Используйте Stream.filter(), чтобы получить только имена, соответствующие вашему charAPresent() методу.Для записи записей перед сбором вы можете использовать Stream.peek():

List<String> modelNameList = myModelList.stream()
        .map(Model::getName) // map only the name
        .filter(YourClass::charAPresent) // filter the items
        .peek(System.out::println) // print all items which are in the filter
        .collect(Collectors.toList());
1 голос
/ 12 июня 2019

Использование Java 8 Stream:

List<String> modelNameList = myModelList.stream()
                                 .map(Model::getName)
                                 .collect(Collectors.toList());

Model::getName называется ссылкой на метод . Это эквивалентно model -> model.getName()

0 голосов
/ 12 июня 2019

Вы также можете использовать foreach так:

public static List<String> modelNames(List<MyModel> myModelList)
    List<String> list = new ArrayList<String>();
    for(MyModel mm : myModelList) {
        if(mm.getName().contains("a") {
            list.add(mm.getName());
        }
    }
    return list;
}
0 голосов
/ 12 июня 2019

Вы можете использовать потоки и сопоставить свой объект с его именем и собрать в список как:

List<String> names = myModelList.stream()
        .map(MyModel::getName)
        .collect(Collectors.toList());

Всегда есть способ перебрать и создать другой список, но он есть любой лучший способ сделать это

Даже с использованием потоков вам придется выполнить итерацию всей коллекции. Нет лучшего способа сделать это, чем выполнить итерацию всей коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...