从流中获取字符串列表

时间:2017-07-03 14:44:10

标签: java java-8 java-stream

我有一个包含字符串和字符串列表的流,我希望将所有值作为字符串列表输出。 无论如何用一些流操作来做到这一点?

Stream stream = Stream.of("v1", Arrays.asList("v2, v3"));

3 个答案:

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