如果流包含多个逗号分隔的值,请拆分该流



这段代码会将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

我需要第二个数组列表来包含然后打印:

test
test2
test3

我知道在Java 8中有过滤器。我可以做类似的事情吗

.filter(p -> p.contains(",")...然后有什么东西可以拆分它?

你可以做一个flatMap,包括一个Pattern::splitAsStream

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

您可以split每个字符串并flatMap生成的数组:

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

您可以使用:

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

输出

test
test2
test3
我需要

第二个数组列表来包含然后打印:

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

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());

最新更新