[英]Adding objects to two lists from a stream
如何以另一種方式將對象添加到 stream 的兩個不同列表中?
這是一個例子
ArrayList<String> someList = new ArrayList();
someList.add("123QWE");
someList.add("QWE123");
//...
ArrayList<String> list1 = new ArrayList<>();
ArrayList<String> list2 = new ArrayList<>();
someList.stream().forEach(string -> {
if (Character.isDigit(string.charAt(0))
{
list1.add(string);
}
else
{
list2.add(string);
}
}
那么,使用 Streams,您還可以使用單個 stream 實現此目的:
Map<Boolean, List<String>> partition = someList.stream()
.collect(Collectors.partitioningBy(str -> Character.isDigit(str.charAt(0))));
現在
partition.get(true)
返回以數字開頭的字符串列表;partition.get(false)
返回其他的。根據您更新的問題,我仍然會使用一個簡單的循環 go。 流對於某些操作非常有用,但它們的內部結構非常復雜。 一旦對每個列表的修改完成,您始終可以在每個列表上調用Collections.sort()
。
這並不是說它不能用流來完成。 但是恕我直言,這樣做沒有任何好處。
ArrayList<Object> list1 = new ArrayList<>();
ArrayList<Object> list2 = new ArrayList<>();
for (String str : someList) {
if (Character.isDigit(str.charAt(0)) {
list1.add(str);
} else {
list2.add(str);
}
}
Collections.sort(list1);
Collections.sort(list2);
但是,如果您真的想使用流,那么這是一種方法。 在完成對原始列表的分離后,它包括排序(你在評論中說過你想要排序)。
sortedList
收集器以共享兩個流。 沒有必要,但減少了代碼。Collector<String,?,List<String>> sortedList = Collectors.collectingAndThen(
Collectors.toList(),
lst->{Collections.sort(lst); return lst;});
List<String> someList = List.of("B","3C","4E","A", "2B","C", "E", "1A");
List<String> list1 = someList.stream()
.filter(str -> !Character.isDigit(str.charAt(0)))
.collect(sortedList);
List<String> list2 = someList.stream()
.filter(str -> Character.isDigit(str.charAt(0)))
.collect(sortedList);
System.out.println(list1);
System.out.println(list2);
印刷
[A, B, C, E]
[1A, 2B, 3C, 4E]
像這樣使用stream.filter()
和collect()
:
list1 = someList.stream().filter(str -> Character.isDigit(str.charAt(0))).collect(Collectors.toList());
list2 = someList.stream().filter(str -> !Character.isDigit(str.charAt(0))).collect(Collectors.toList());
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.