我正在尝试学习 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]
答案 0 :(得分:1)
在使用输入的 ArrayList
和 List
更正您的原始代码后,您可以按如下方式进行:
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
。由于我无法想象在生产环境中会出现这种情况,因此我认为这纯粹是一种学术练习。