尝试在使用 FlatMap 时遇到问题

时间:2021-06-04 12:54:19

标签: java java-stream

我正在尝试学习 FlatMap 及其用法,我有一个如下所示的 ArrayList,

props: {
    projectData: {},
    allStatuses: {},
    allColors: {},
    allPriorities: {},
    allMembers: {},
    allTeams: {}
}

数据将按以下方式存储:

ArrayList check = new ArrayList();
check.add("a");
check.add("b");
check.add("c");
ArrayList middleList = new ArrayList();
middleList.add("d");
middleList.add("e");
middleList.add("f");
middleList.add("g");
check.add(middleList);
check.add("h");
check.add("i");
check.add("j");
System.out.println(check);

现在,我期望输出为

[a, b, c, [d, e, f, g], h, i, j]

为此,我编写了以下代码,

[a, b, c, d, e, f, g, h, i, j]

说明:对于数组列表检查,我创建了一个流对象并在此处调用了 flatMap 我正在检查该对象是否是 ArrayList 的实例,然后我打算为该数组列表创建一个流。

它抛出 ClassCastException 不知道我哪里出错了。

根据迈克尔的建议进行编辑:

System.out.println(check.stream()
        .flatMap(data -> data instanceof ArrayList ? Stream.of(data):data)
        .collect(Collectors.toList()));

输出:正如预期的那样: [a, b, c, d, e, f, g, h, i, j]

1 个答案:

答案 0 :(得分:1)

在使用输入的 ArrayListList 更正您的原始代码后,您可以按如下方式进行:

List<Object> check = new ArrayList<>();
check.add("a");
check.add("b");
check.add("c");
ArrayList<String> middleList = new ArrayList<>();
middleList.add("d");
middleList.add("e");
middleList.add("f");
middleList.add("g");
check.add(middleList);
check.add("h");
check.add("i");
check.add("j");
System.out.println(check);

List<Object> list = check.stream()
        .flatMap(s -> s instanceof List ?
                ((List<?>) s).stream() : Stream.of(s))
        .collect(Collectors.toList());

System.out.println(list);

印刷品

[a, b, c, [d, e, f, g], h, i, j]
[a, b, c, d, e, f, g, h, i, j]

FlatMap 扁平化流,因此您需要检查类型并通过将对象转换为 List<?> 并创建流或通过创建单个元素流来生成类型。这将返回一个 List<Object>。如果您想要 List<String>,则需要包含其他类型转换和过滤器。

这样做的总体问题是您的混合类型并不都适合 flatMap。由于我无法想象在生产环境中会出现这种情况,因此我认为这纯粹是一种学术练习。