如何在Java 8中使用Streams实现如下

时间:2016-07-07 18:56:04

标签: java java-8 java-stream

我们如何实现以下使用流

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

2 个答案:

答案 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");
    }