簡體   English   中英

將List的字段映射到另一個List

[英]Map fields of a List to another List

我是新來的Java 8,我有2個List聊天的,我想設置在某些領域List AList B ,如果他們的ID是匹配

聊天:

public class Chat {

    private String id;

    private Status status;

    private Rating rating;

    //Setters and getters
}

我可以通過使用嵌套循環來完成它,但不知道如何在java 8中執行它:

List<Chat> listA = getDataForA();
List<Chat> listB = getDataForB();

listA .forEach(a -> {
   listB.forEach(b-> {
       if (b.getId().equals(a.getId())) {
            a.setRating(b.getRating());
            a.setStatus(b.getStatus());
       }
  });
});

你可以嘗試這個流嗎,只有當listA和listB id匹配時,我們才會從listA流設置評級和狀態

    listA.stream()
            .flatMap(a -> listB.stream().filter(b -> b.getId().equals(a.getId())).map(b -> {
                a.setRating(b.getRating());
                a.setStatus(b.getStatus());
                return a;
            }))
            .collect(Collectors.toList());

我會給出另一種方法,而不是簡單的兩個循環:按id給出列表,然后在所有id上循環一次:

public static void main(String... args) {
    List<Chat> listA = getDataForA();
    List<Chat> listB = getDataForB();

    Map<String, Chat> mapA = groupById(listA);
    Map<String, Chat> mapB = groupById(listB);

    mapA.entrySet().stream()
        .filter(entry -> mapB.containsKey(entry.getKey()))
        .forEach(entry -> {
            Chat a = entry.getValue();
            Chat b = mapB.get(entry.getKey());
            a.setRating(b.getRating());
            a.setStatus(b.getStatus());
        });
}

private static Map<String, Chat> groupById(Collection<Chat> data) {
    return Optional.ofNullable(data).orElse(Collections.emptyList()).stream().collect(Collectors.toMap(Chat::getId, Function.identity()));
}

如何創建列表<object>帶有字段字符串和 Map <string, set<string> &gt; 從另一個列表<object2><div id="text_translate"><p> Class Object2具有標准的 getter 並具有String字段folder 、 file和version 。 它被命名為SourceInfo</p><p> List&lt;SourceInfo&gt; source包含上面提到的三個字段。</p><p> 我的目標是從List&lt;SourceInfo&gt;創建一個List&lt;Info&gt; &gt; 。</p><p> 新List的 class 為Info ,如下圖所示。</p><pre> public class Info { private final String folder; private final Map&lt;String, Set&lt;String&gt;&gt; file; public static Builder builder() { return new Builder(); } public static Builder builder(Info info) { return new Builder(info); } private Info(Builder builder) { this.folder = builder.folder; this.file = builder.file; } public String getFolder() { return folder; } public Map&lt;String, Set&lt;String&gt;&gt; getFile() { return file; } // autogenerated toString, hashCode, and equals public static class Builder { private String folder; private Map&lt;String, Set&lt;String&gt;&gt; file; private Builder() {} private Builder(Info info) { this.folder = info.folder; this.file = info.file; } public Builder with(Consumer&lt;Builder&gt; consumer) { consumer.accept(this); return this; } public Builder withFolder(String folder) { this.folder = folder; return this; } public Builder withFile(Map&lt;String, Set&lt;String&gt;&gt; file) { this.file = file; return this; } public Info build() { return new Info(this); } }</pre><p> 到目前為止,我嘗試的是在構建器模式中創建一個集合。</p><pre> List&lt;SourceInfo&gt; source; // error: gc overhead limit exceeded List&lt;Info&gt; infoList = source.stream().map(e -&gt; Info.builder().withFolder(e.getFolder()).withFile(source.stream().collect(Collectors.groupingBy(SourceInfo::getKey, Collectors.mapping(SourceInfo::getVersion, Collectors.toSet())))).build()).collect(Collectors.toList()); Map&lt;String, Set&lt;String&gt;&gt; map = source.stream().collect(Collectors.groupingBy(SourceInfo::getKey, Collectors.mapping(SourceInfo::getVersion, Collectors.toSet()))); List&lt;Info&gt; info = source.stream().map(e -&gt; Info.builder().withFolder(e.getFolder()).withFile(map.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))).build()).collect(Collectors.toList());</pre><p> 所需的 output。 以下語法可能已關閉。</p><pre> // [String, Map&lt;String, Set&lt;String&gt;&gt;] Info [folder, [key=file [value=version]]]...</pre><p> 我是 Java 的新手,不勝感激。</p><p> 我想了解如何使用 java8 和 for 循環來做到這一點。</p><p> 謝謝你。</p></div></object2></string,></object>

[英]How to create a List<Object> with fields String and Map<String, Set<String>> from another List<Object2>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 Map 用映射結構列出的幾個字段 如何創建列表<object>帶有字段字符串和 Map <string, set<string> &gt; 從另一個列表<object2><div id="text_translate"><p> Class Object2具有標准的 getter 並具有String字段folder 、 file和version 。 它被命名為SourceInfo</p><p> List&lt;SourceInfo&gt; source包含上面提到的三個字段。</p><p> 我的目標是從List&lt;SourceInfo&gt;創建一個List&lt;Info&gt; &gt; 。</p><p> 新List的 class 為Info ,如下圖所示。</p><pre> public class Info { private final String folder; private final Map&lt;String, Set&lt;String&gt;&gt; file; public static Builder builder() { return new Builder(); } public static Builder builder(Info info) { return new Builder(info); } private Info(Builder builder) { this.folder = builder.folder; this.file = builder.file; } public String getFolder() { return folder; } public Map&lt;String, Set&lt;String&gt;&gt; getFile() { return file; } // autogenerated toString, hashCode, and equals public static class Builder { private String folder; private Map&lt;String, Set&lt;String&gt;&gt; file; private Builder() {} private Builder(Info info) { this.folder = info.folder; this.file = info.file; } public Builder with(Consumer&lt;Builder&gt; consumer) { consumer.accept(this); return this; } public Builder withFolder(String folder) { this.folder = folder; return this; } public Builder withFile(Map&lt;String, Set&lt;String&gt;&gt; file) { this.file = file; return this; } public Info build() { return new Info(this); } }</pre><p> 到目前為止,我嘗試的是在構建器模式中創建一個集合。</p><pre> List&lt;SourceInfo&gt; source; // error: gc overhead limit exceeded List&lt;Info&gt; infoList = source.stream().map(e -&gt; Info.builder().withFolder(e.getFolder()).withFile(source.stream().collect(Collectors.groupingBy(SourceInfo::getKey, Collectors.mapping(SourceInfo::getVersion, Collectors.toSet())))).build()).collect(Collectors.toList()); Map&lt;String, Set&lt;String&gt;&gt; map = source.stream().collect(Collectors.groupingBy(SourceInfo::getKey, Collectors.mapping(SourceInfo::getVersion, Collectors.toSet()))); List&lt;Info&gt; info = source.stream().map(e -&gt; Info.builder().withFolder(e.getFolder()).withFile(map.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue))).build()).collect(Collectors.toList());</pre><p> 所需的 output。 以下語法可能已關閉。</p><pre> // [String, Map&lt;String, Set&lt;String&gt;&gt;] Info [folder, [key=file [value=version]]]...</pre><p> 我是 Java 的新手,不勝感激。</p><p> 我想了解如何使用 java8 和 for 循環來做到這一點。</p><p> 謝謝你。</p></div></object2></string,></object> 將列表中的元素映射到另一個列表中的位置 Java 8將列表映射到另一個列表並計數 如何將 map 通用列表轉換為另一個通用列表? Java Map 具有列表值,在另一個列表上過濾 map 將對象列表轉換為另一個對象列表的方法 如何將列表字段轉換為java中的映射 從列表中檢索值 <Map> 並將其插入另一個列表 <Map> Java 8 create將復雜類型的列表映射到其字段之一的列表
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM