如何在Java8中使用Streams实现以下内容

如何在Java8中使用Streams实现以下内容,java,java-8,java-stream,Java,Java 8,Java Stream,我们如何使用流实现以下功能 for(String str: list){ if(someCondition(str)){ list2.add(doSomeThing(str)); } else{ list3.add(doSomethingElse(str)); } } 如果您希望获得两个列表,请尝试以下方法: Map<Boolean, List<String>> map = list.stream().colle

我们如何使用流实现以下功能

for(String str: list){
   if(someCondition(str)){
      list2.add(doSomeThing(str));
   }
   else{
      list3.add(doSomethingElse(str));
   }
 }

如果您希望获得两个列表,请尝试以下方法:

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());
地图
=list.stream().collect(分区依据(MyClass::someCondition));
List list2=map.get(true).stream()
.map(MyClass::doSomething).collect(toList());
List list3=map.get(false).stream()
.map(MyClass::doSomethingElse).collect(toList());

(或者,您可以将两个参数版本的
partitioning by
与下游
mapping()
收集器一起使用,该收集器必须再次测试该条件。)

您可以尝试此操作,它只会解析列表一次:

    @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");
    }
@测试
无效读取\u列表\u一次(){
列表名称=Arrays.asList(“Nico”、“Isa”、“Fran”、“Percy”);
Map collect=names.stream()
.collect(收集器.groupingBy(s->s.length()>4?“gt4”:“ngt4”);
资产(collect.get(“gt4”))。实际包含(“Percy”);
(收集、获取(“ngt4”))实际包含(“Nico”、“Isa”、“Fran”)的资产;
}

这不是用于流的最佳示例。流主要用于单输入和单输出,这里有两个输出,因此这将是对流的滥用(但可行)。你能说明它是如何可行的吗?你可以在两个单独的流中进行,但正如krzyk所说,流更多用于单输入单输出。但是您可以执行类似的操作:
list.stream().filter(s->someCondition(s)).forEach(s->list2.add(doSomeThing(s));
然后
list.stream().filter(s->someCondition(s)).forEach(s->list3.add(doSomethingElse(s))
但是如果我们使用两个流,它将是低效的。想知道有没有更好的方法来编写上面的for循环…考虑到干净的编码实践…两个arg
partitioning by
和下游
mapping()
仅适用于
list2
list3
具有相同元素类型的情况,即
doSomething
doSomethingElse
返回相同的类型,这是我们无法从问题中推导出来的……很好,但是我们仍然在列表上循环两次,一次用于分区,稍后在list2和list3类型中进行映射。