如何以另一种方式从流中添加两个不同列表中的对象?
这里有一个例子
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,您也可以使用单个流来实现这一点:
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)
返回其他人。基于您更新的问题,我仍然会使用一个简单的循环。流非常适合某些操作,但它们的内部结构相当复杂。一旦对每个列表的修改完成,您总是可以在每个列表上调用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]
使用流。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());
我可以添加流或额外的元素,像这样: 我可以边走边添加新的东西,比如: 但这很难看,因为是静态的。如果是一个实例方法,那么上面的示例将更容易阅读: 而且 2)无论如何,有没有更好的方法?
如果是的话,我们能做吗? 在这里,我想从相同的MyObject对象getTestId中添加一个属性到列表中,有一种方法可以在上面的语句中添加吗?
问题内容: 我可以添加流或其他元素,如下所示: 我可以随时添加新内容,例如: 但这是丑陋的,因为是静态的。如果是实例方法,则上面的示例将更容易阅读: 和 我的问题是: 1)是否有充分的理由为什么它是静态的?还是我缺少一些等效的实例方法? 2)无论如何,有没有更好的方法呢? 问题答案: 如果为 Stream.concat 和 Stream.of 添加 静态导入 ,则第一个示例可以编写如下: 导入具有
为所有的代码道歉。我尽量少发帖。
如何将一个流中的对象同时添加到两个不同的列表中 目前我正在做 要将流中的对象添加到linkedlist“resourceMemory”中,我还想同时将相同的对象添加到另一个列表中,但我找不到它的语法。是否可能,或者每个列表需要两份代码副本?