从另一个对象列表创建一个对象元素的列表

时间:2019-06-12 01:28:26

标签: java arraylist collections java-stream

模型:

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 e.t.c。)。

编辑: 答案对我有用,但是我对用例进行了一些修改:如果我想添加一个条件,则仅将包含字符“ a”的名称添加到列表中,并且我想添加记录器消息以调试每个元素那我该怎么办呢?

我尝试使用方法(charAPresent())进行以下操作,该方法检查所传递的字符串是否包含字符'a'但不起作用:

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

让我知道我是否想念一些东西。

4 个答案:

答案 0 :(得分:1)

使用Java 8 Stream:

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

Model::getName被称为method reference。它等效于model -> model.getName()

答案 1 :(得分:1)

您可以使用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());

答案 2 :(得分:0)

您可以使用流并将对象映射到其名称,并按以下方式收集到列表:

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

总有一种方法可以迭代并创建另一个列表,但是有   更好的方法

即使使用流,您也必须迭代整个集合。没有比遍历整个集合更好的方法了。

答案 3 :(得分:0)

您也可以像这样使用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;
}