将对象添加到流中的两个列表
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其他
如何以另一种方式将对象添加到流中的两个不同列表中?
这是一个例子
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其他