簡體   English   中英

Java8 Lambda 比較兩個List並轉換為Map

[英]Java8 Lambda compare two List and trasform to Map

假設我有兩個 class:

class Key {
 private Integer id;
 private String key;
}

class Value {
  private Integer id;
  private Integer key_id;
  private String value;
}

現在我填寫第一個列表如下:

List<Key> keys = new ArrayLisy<>();
keys.add(new Key(1, "Name"));
keys.add(new Key(2, "Surname"));
keys.add(new Key(3, "Address"));

第二個:

List<Value> values = new ArrayLisy<>();
values.add(new Value(1, 1, "Mark"));
values.add(new Value(2, 3, "Fifth Avenue"));
values.add(new Value(3, 2, "Fischer"));

你能告訴我如何重寫以下代碼:

for (Key k : keys) {
        for (Value v : values) {
            if (k.getId().equals(v.getKey_Id())) {
                map.put(k.getKey(), v.getValue());
                break;
        }
    }
}

使用 Lambda?

謝謝!

- - - -更新 - - - -

是的,它確實有效,我忘記了第一篇文章中的“使用 Lambdas”(現在我添加了)。 我想用 Lamdas 重寫兩個嵌套for cicle。

以下是使用流的方法。

  • stream 密鑰列表
  • stream 索引值列表的索引
  • 過濾匹配的 id
  • package將key實例key和value實例值放入一個SimpleEntry。
  • 然后將其添加到 map。
Map<String, String> results = keys.stream()
        .flatMap(k -> IntStream.range(0, values.size())
                .filter(i -> k.getId() == values.get(i).getKey_id())
                .mapToObj(i -> new AbstractMap.SimpleEntry<>(
                        k.getKey(), values.get(i).getValue())))
        .collect(Collectors.toMap(Entry::getKey, Entry::getValue));

results.entrySet().forEach(System.out::println);

印刷

Address=Fifth Avenue
Surname=Fischer
Name=Mark

Imo,你的方式更清晰,更容易理解。 Streams/w lambdas 或方法引用並不總是最好的方法。

也可以考慮采用混合方法。

  • 分配一個 map。
  • 遍歷鍵。
  • stream 值試圖在 key_id 上找到匹配項並返回找到的第一個。
  • 找到值(isPresent)添加到 map。
Map<String,String> map = new HashMap<>();

for (Key k : keys) {
    Optional<Value> opt = values.stream()
            .filter(v -> k.getId() == v.getKey_id())
            .findFirst();
    if (opt.isPresent()) {
        map.put(k.getKey(), opt.get().getValue());
    }
}

如何以優雅的方式使用 Java8 返回 map<object, long> 來自列表<object>計數發生?<div id="text_translate"><p> 我知道標題很拗口,所以我將嘗試用一個例子來解釋。</p><p> 我有一個清單。 Chores 有一個 id 字段作為標識符,但列表將包含許多家務,其中一些將具有相同的 ID。 我的目標是返回一個 Map&lt;Chore, Long&gt; ,其中 long 將計算雜務的出現次數。 例如:</p><pre> List&lt;Chore&gt; choreList = new ArrayList&lt;Chore&gt;(); choreList.add(new Chore("1", "vacuum", "7-6-22"); //Numbers 1,2,3 are the ID's for each chore choreList.add(new Chore("2", "dusting", "7-1-22"); choreList.add(new Chore("3", "mowing", "7-15-22"); choreList.add(new Chore("1", "vacuum", "7-14-22"); choreList.add(new Chore("1", "vacuum", "7-18-22"); choreList.add(new Chore("2", "dusting", "7-24-22");</pre><p> 使用此列表和 Java8 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ function,我想返回一個 Map&lt;Chore, Long&gt;,其中包含家務 object 和事件。 因此,對於 ID 為“1”的雜項,長為 3。對於 ID 為“2”的雜項,長為 2……等等。</p><p> 我試圖為此找到一個優雅的解決方案,但看起來每個人都可以得到如下內容:</p><pre> Map&lt;String, Long&gt; choresById = chores.stream().collect(Collectors.groupingBy(Chore::getId, Collectors.counting()));</pre><p> 我怎樣才能想出 Map&lt;Chore, Long&gt; 而不是 Map&lt;String, Long&gt; (在這種情況下,字符串是 ID?)</p></div></object></object,>

[英]How to use Java8 in an elegant way to return a map of <Object, Long> from a List<Object> counting occurrence?

暫無
暫無

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

相關問題 如何使用 lambda/java8 迭代遞歸列表 如何使用 Java8 Stream 檢查 map 列表中是否存在值 比較Java中的兩個列表 在Java8中使用多個布爾鍵對地圖對象列表進行排序 使用 javascript 中的 lambda 比較列表中的兩個對象 使用Java8流過濾Map的密鑰后映射到List Elixir中元組中的Trasform列表 Java比較列表與地圖和輸出結果 將 Map 中的鍵與 java 中列表中的元素進行比較 如何以優雅的方式使用 Java8 返回 map<object, long> 來自列表<object>計數發生?<div id="text_translate"><p> 我知道標題很拗口,所以我將嘗試用一個例子來解釋。</p><p> 我有一個清單。 Chores 有一個 id 字段作為標識符,但列表將包含許多家務,其中一些將具有相同的 ID。 我的目標是返回一個 Map&lt;Chore, Long&gt; ,其中 long 將計算雜務的出現次數。 例如:</p><pre> List&lt;Chore&gt; choreList = new ArrayList&lt;Chore&gt;(); choreList.add(new Chore("1", "vacuum", "7-6-22"); //Numbers 1,2,3 are the ID's for each chore choreList.add(new Chore("2", "dusting", "7-1-22"); choreList.add(new Chore("3", "mowing", "7-15-22"); choreList.add(new Chore("1", "vacuum", "7-14-22"); choreList.add(new Chore("1", "vacuum", "7-18-22"); choreList.add(new Chore("2", "dusting", "7-24-22");</pre><p> 使用此列表和 Java8 ZF7B44CFFAFD5C52223D5498196C8A2E7BZ function,我想返回一個 Map&lt;Chore, Long&gt;,其中包含家務 object 和事件。 因此,對於 ID 為“1”的雜項,長為 3。對於 ID 為“2”的雜項,長為 2……等等。</p><p> 我試圖為此找到一個優雅的解決方案,但看起來每個人都可以得到如下內容:</p><pre> Map&lt;String, Long&gt; choresById = chores.stream().collect(Collectors.groupingBy(Chore::getId, Collectors.counting()));</pre><p> 我怎樣才能想出 Map&lt;Chore, Long&gt; 而不是 Map&lt;String, Long&gt; (在這種情況下,字符串是 ID?)</p></div></object></object,>
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM