我们如何实现以下使用流
for(String str: list){
if(someCondition(str)){
list2.add(doSomeThing(str));
}
else{
list3.add(doSomethingElse(str));
}
}
答案 0 :(得分:4)
如果您想要获得两个列表,请尝试以下方法:
Map<Boolean, List<String>> map
= list.stream().collect(partitioningBy(MyClass::someCondition));
List<String> list2 = map.get(true).stream()
.map(MyClass::doSomething).collect(toList());
List<String> list3 = map.get(false).stream()
.map(MyClass::doSomethingElse).collect(toList());
(或者,您可以将partitioningBy
的两个arg版本与下游mapping()
收集器一起使用,这将需要再次测试该条件。)
答案 1 :(得分:0)
您可以尝试执行此操作,它只会解析一次列表:
@Test
void reading_the_list_once() {
List<String> names = Arrays.asList("Nico", "Isa", "Fran", "Percy");
Map<String, List<String>> collect = names.stream()
.collect(Collectors.groupingBy(s -> s.length() > 4 ? "gt4" : "ngt4"));
assertThat(collect.get("gt4")).containsExactly("Percy");
assertThat(collect.get("ngt4")).containsExactly("Nico", "Isa", "Fran");
}