我有一个包含字符串和字符串列表的流,我希望将所有值作为字符串列表输出。 无论如何用一些流操作来做到这一点?
Stream stream = Stream.of("v1", Arrays.asList("v2, v3"));
答案 0 :(得分:6)
通常你不会在列表中混淆这些不同的类型,但你可以从中得到你想要的结果;每个单个字符串可以转换为一个字符串的流,每个字符串列表可以转换为多个字符串的流;然后flatMap
将所有流拼凑成一个单独的字符串流。
List<String> strings = l.stream()
.flatMap(o -> {
if (o instanceof List) {
return ((List<String>) o).stream();
}
return Stream.of((String) o);
})
.collect(Collectors.toList());
您会收到unchecked cast
警告,但这就是您在一个容器中混合使用不同类型的内容。
答案 1 :(得分:3)
如果你想避免“未经检查”的警告,你需要在flatMap
步骤之后,当单{{1}时,强制转换每个元素,当你将它作为后续的每个元素操作执行时元素和String
实例已经统一处理:
List
但是,正如其他人已经说过的那样,首先没有这样的混合型列表,是更好的选择。
答案 2 :(得分:2)
您希望在对象列表上使用流,然后根据对象的性质执行某些操作。为此,您可以使用Khelwood's answer。但你可能更好地使用类似的东西:
List<String> l = new ArrayList<>();
l.add("v1");
l.addAll(Arrays.asList("v2","v3"));