簡體   English   中英

java stream-如何將一個集合過濾為兩個新集合

[英]java streams - How to filter a collection to two new collections

我嘗試創建兩個列表-賠率如下:

public static void main(String[] args) {
    List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 5, 8, 13, 21));
    List<Integer> odds = new ArrayList<>();
    List<Integer> evens = new ArrayList<>();
    numbers.stream().forEach(x -> x % 2 == 0 ? evens.add(x) : odds.add(x));
}

但這給了我不兼容的類型錯誤(lambda表達式中的返回類型錯誤,缺少返回值)

將一個集合過濾到兩個新集合的最佳方法是什么?

當其他答案解釋為什么它不能編譯時,我將在您的情況下使用partitioningBy收集器並獲取結果列表:

import static java.util.stream.Collectors.partitioningBy;

...

List<Integer> numbers = Arrays.asList(1, 2, 3, 5, 9, 13, 21);

Map<Boolean, List<Integer>> partition = 
    numbers.stream().collect(partitioningBy(x -> x % 2 == 0));

List<Integer> odds = partition.get(false);
List<Integer> evens = partition.get(true);

好吧,您可以對現有的代碼進行簡單的修改:

 public static void main(String[] args) {         
     List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 5, 8, 13, 21));
     List<Integer> odds = new ArrayList<>();
     List<Integer> evens = new ArrayList<>();
     numbers.stream().forEach(x -> (x % 2 == 0 ? evens : odds).add(x));
 }

條件?:運算符是一個表達式 ,它本身不是有效的語句。 我修改后的代碼更改使用條件運算符的只是選擇要添加到列表中,然后調用add就可以了-這方法調用表達一個有效的語句。

另一種方法是,以collect使用Collectors.partitioningBy -雖然在這種特殊情況下,將可能會更混亂的代碼比你得到了什么。

三元運算符不是語句。 如果使用forEach塊,則需要有效的Java語句或完整的塊:

numbers.stream().forEach(x -> {
    if (x % 2 == 0 ) { 
        pairs.add(x); 
    } else { 
        ods.add(x);
    }
});

暫無
暫無

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

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