簡體   English   中英

從另一個對象列表創建一個對象元素的列表

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM