模型:
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());
让我知道我是否想念一些东西。
答案 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;
}