簡體   English   中英

Java:有沒有更優雅的方法可以使用 reduce 從現有列表中提取新列表?

[英]Java: is there more elegant way to extract a new list from an existing list using reduce?

我正在嘗試獲取元素列表,對這些元素的一部分進行一些操作,並將這些操作的 output 放在一個新列表中。 我只想在列表中進行一次迭代。

我發現這樣做的唯一方法是:

List<Integer> newList = numList.stream().reduce(new ArrayList<Integer>(),
            (acc, value) -> {
                if (value % 2 == 0) {
                    acc.add(value * 10);
                }
                return acc;
            },
            (l1, l2) -> {
                l1.addAll(l2);
                return l1;
            }
        );

如您所見,這非常麻煩。

我當然可以使用filter然后map ,但在這種情況下我迭代列表兩次。

在其他語言(例如Javascript)中,這種reduce操作非常簡單,例如:

arr.reduce((acc, value) => { 
    if (value % 2 == 0) {
        acc.push(value * 10);
    }
    return acc;
}, new Array())

驚人。 我在想,Java 是否有更好的減少版本,或者我編寫的 Java 代碼是執行此類操作的最短方法。

我當然可以使用過濾器和它們 map,但在這種情況下,我將列表迭代兩次。

這不是真的。 Stream的元素迭代一次,不管你有多少中間操作。

此外,執行可變歸約的正確方法是使用collect

List<Integer> newList =
    numList.stream()
            .filter(v -> v % 2 == 0)
            .map(v -> v * 10)
            .collect(Collectors.toList());

您所做的與函數式編程相反,因為您使用函數只是為了獲得副作用。

您可以簡單地不使用 reduce 使其更加明確:

List<Integer> newList = numList.stream()
    .filter(value -> value % 2 == 0)
    .map(value -> value * 10)
    .collect(Collectors.toList());

編輯: Stream根據定義對集合進行一次迭代。 根據javadoc

stream 應該只運行一次(調用中間或終端 stream 操作)。

如何以優雅的方式使用 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.

相關問題 有沒有更優雅的方法來使用java 8從列表中獲取隨機未使用的項? 有沒有一種方法可以更優雅地編寫此“ if”列表? 有沒有更優雅的方法來基於列表啟動線程? 使用 Java 流檢查列表包含的優雅方式 有沒有一種優雅的方式從列表中生成 Excel 電子表格<POJO> ? (爪哇) 用Java從列表中提取地圖的最短方法 用Java從多個列表提取數據到新列表的最優雅方法? 如何使用 java stream 從現有列表中轉換創建的新匹配值列表 如何在 Java 8 中使用 reduce 從 Object 列表中創建字符串列表? 如何以優雅的方式使用 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