![](/img/trans.png)
[英]Checking two collections using new Java 8 API streams and lambdas expressions
[英]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.