簡體   English   中英

將對象添加到 stream 中的兩個列表

[英]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.

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