[英]Create list of an element of an Object from another list of Objects
該模型:
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中存在的名稱列表,即我想從myModelList
創建名稱List<String>
(在這種情況下為List<String>
)。 因此,我希望我的清單具有:
{"abc", "pqr"}
總有一種方法可以迭代並創建另一個列表,但是還有更好的方法嗎? (不一定是有效的,但如果可以使用流,foreach等在一行中完成)。
編輯:答案對我有用,但是我在用例中做了一些修改:如果我想添加一個條件,即僅將包含字符“ a”的名稱添加到列表中,並且我想添加記錄器消息以進行調試那么每個元素應該如何處理呢?
我嘗試使用方法( charAPresent()
)執行以下操作,該方法檢查所傳遞的字符串是否包含字符“ a”,但不起作用:
List<String> modelNameList = myModelList.stream()
.map(model -> {
if (charAPresent(model.getName)) {
model.getName()
}
})
.collect(Collectors.toList());
讓我知道我是否想念一些東西。
使用Java 8 Stream:
List<String> modelNameList = myModelList.stream()
.map(Model::getName)
.collect(Collectors.toList());
Model::getName
稱為方法引用 。 它等效於model -> model.getName()
您可以使用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());
您可以使用流並將對象映射到其名稱,並按以下方式收集到列表:
List<String> names = myModelList.stream()
.map(MyModel::getName)
.collect(Collectors.toList());
總有一種方法可以迭代並創建另一個列表,但是有沒有更好的方法可以做到這一點
即使使用流,您也必須迭代整個集合。 沒有比迭代整個集合更好的方法了。
您也可以像這樣使用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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.