将对象添加到流中的两个列表

Adding objects to two lists from a 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);
    }
}

根据你更新的问题,我仍然会使用一个简单的循环。流对于某些操作非常有用,但它们的内部结构非常复杂。一旦对每个列表的修改完成,您始终可以在每个列表上调用 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());

好吧,使用 Streams,您也可以通过单个流实现此目的:

Map<Boolean, List<String>> partition = someList.stream()
    .collect(Collectors.partitioningBy(str -> Character.isDigit(str.charAt(0))));

现在

  • partition.get(true) returns 字符串以数字开头的列表;
  • partition.get(false)returns其他