如果流包含多个以逗号分隔的值,则拆分流

时间:2017-08-16 19:34:04

标签: java lambda filter java-8 java-stream

此代码会将mylist中的所有元素添加到mylist2。

如果找到逗号,如何更改它以添加元素,并将它们分开?

ArrayList<String> mylist = new ArrayList<String>();
mylist.add("test");
mylist.add("test2, test3");
ArrayList<String> mylist2 = new ArrayList<String>();

mylist.stream()
    .forEach(s -> mylist2.add(s));

mylist2.stream().forEach(System.out::println);

所以,目前的输出是:

test
test2, test3

我需要第二个arraylist来包含然后打印:

test
test2
test3

我知道在Java 8中有过滤器。我可以做点什么吗

.filter(p -> p.contains(",")... 那会分裂一下吗?

4 个答案:

答案 0 :(得分:4)

您可以执行flatMap,其中包括Pattern::splitAsStream

Pattern splitAtComma = Pattern.compile("\\s*,\\s*");
List<String> myList2 = mylist.stream().flatMap(splitAtComma::splitAsStream)
                         .collect(Collectors.toList());

答案 1 :(得分:3)

你可以split每个字符串和flatMap生成的数组:

mylist.stream()
      .flatMap(x -> Arrays.stream(x.split(", ")))
      .forEach(System.out::println);

答案 2 :(得分:1)

您可以使用:

mylist.forEach(str -> mylist2.addAll(Arrays.asList(str.split("\\s*,\\s*"))));

<强>输出

test
test2
test3

答案 3 :(得分:1)

  

我需要第二个arraylist来包含然后打印:

您可以创建两个流:一个用于创建目标List,另一个用于显示它。

List<String> list2 = mylist.stream()
    .flatMap(x -> Arrays.stream(x.split(", ")))
    .collect(Collectors.toList());

list2.stream().forEach(System.out::println);

或使用peak()输出流的元素,然后收集到List

List<String> list2 = mylist.stream()
    .flatMap(x -> Arrays.stream(x.split(", ")))
    .peek(System.out::println)
    .collect(Collectors.toList());