Java 从流中获取字符串列表

Java 从流中获取字符串列表,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个包含字符串和字符串列表的流,我想将所有值作为字符串列表导出。 无论如何,要用一些流操作来实现这一点吗 Stream stream = Stream.of("v1", Arrays.asList("v2, v3")); 通常情况下,你不会在一个列表中混合这些不同的类型,但是你可以从中得到你想要的结果;每个字符串可以转换为一个字符串的流,每个字符串列表可以转换为多个字符串的流;然后flatMap将所有流展平为一个字符串流 List<String> strings = l.str

我有一个包含字符串和字符串列表的流,我想将所有值作为字符串列表导出。 无论如何,要用一些流操作来实现这一点吗

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

通常情况下,你不会在一个列表中混合这些不同的类型,但是你可以从中得到你想要的结果;每个字符串可以转换为一个字符串的流,每个字符串列表可以转换为多个字符串的流;然后
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());
List strings=l.stream()
.flatMap(o->{
if(o instanceof List){
return((List)o).stream();
}
((字符串)o)的返回流;
})
.collect(Collectors.toList());

您将得到一个
未选中强制转换
警告,但这就是在一个容器中混合不同类型所得到的警告。

您希望在对象列表上使用流,然后根据对象的性质执行某些操作。要做到这一点,您可以使用。但你很可能会更好地使用以下方法:

List<String> l = new ArrayList<>();
l.add("v1");
l.addAll(Arrays.asList("v2","v3"));
listl=newarraylist();
l、 添加(“v1”);
l、 addAll(Arrays.asList(“v2”、“v3”);

如果要避免“未检查”警告,必须在
flatMap
步骤之后,当单个
字符串
元素和
列表
实例已被统一处理时,将每个元素强制转换为后续的每个元素操作,效果最佳:

List<Object> list = new ArrayList<>();
list.add("v1");
list.add(Arrays.asList("v2","v3"));

List<String> strings = list.stream()
    .flatMap(o -> o instanceof List? ((List<?>)o).stream(): Stream.of(o))
    .map(String.class::cast)
    .collect(Collectors.toList());
List List=new ArrayList();
列表。添加(“v1”);
添加(Arrays.asList(“v2”、“v3”);
List strings=List.stream()
.flatMap(o->o instanceof List?((List)o).stream():stream.of(o))
.map(String.class::cast)
.collect(Collectors.toList());

但是,正如其他人已经说过的,首先没有这样一个混合类型列表是更好的选择。

这里的流在哪里?你说的流是什么意思?你想得到什么?为什么不使用
l.addAll(Arrays.asList(“v2”、“v3”))
,然后键入
l
作为
列表
?我有一个包含字符串的列表。。。。不,你不知道……这有点简单,我得到了一个混合类型的流。你可以通过添加
if(o instanceof String)
no?@Nathan no,警告是从强制转换到
(List)
,因为Java无法验证泛型类型。
instanceof
将无效。好的,这是我的解决方案,现在想知道我是否可以在某些情况下跳过instanceofway@poyger避免实例的方法是不要在一个容器中混合不同类型的对象。只要它们混在一起,你就需要像
instanceof
这样的东西来分离它们。你,但当然,没有办法摆脱
instanceof