当前位置: 首页 > 知识库问答 >
问题:

从一个流向两个列表添加对象

顾泰平
2023-03-14

如何以另一种方式从流中添加两个不同列表中的对象?

这里有一个例子

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);
    }
}

共有3个答案

上官和韵
2023-03-14

好吧,使用Streams,您也可以使用单个流来实现这一点:

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

现在

  • partition.get(true)返回字符串以数字开头的列表;
  • partition.get(false)返回其他人。
柳梓
2023-03-14

基于您更新的问题,我仍然会使用一个简单的循环。流非常适合某些操作,但它们的内部结构相当复杂。一旦对每个列表的修改完成,您总是可以在每个列表上调用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]
邢洋
2023-03-14

使用流。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());
 类似资料: