列表<Map<String, Object>>的Java 8过滤器和收集

Box*_*617 1 java filtering java-8 java-stream

好的,所以我有一个要过滤的地图列表,然后收集到另一个地图列表。每次我在整个过程中放入该列表时,我都会得到一个对象列表...帮助?!

List<Map<String, Object>> segments = (List<Map<String, Object>>) (List<?>) query.getResultList();

List<Map<String, Object>> segmentsWithMoreVersions = segments.stream()
            .filter((Object s) -> {
                Object[] ss = (Object[]) s;
                if(((Long) ss[2]) == 1)
                {
                    return false;
                }
                return true;
            })
            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

如您所见...在过滤器方法中,我使用了一个对象,因为我无法将 s 变量设为 Map。当我尝试时,我得到一个 ClassCastException。

编辑:好的,也许需要更多信息......所以我的segments变量是这样的:

[
    {'name': 'ABC', 'version': 1, 'ct': 1},
    {'name': 'AAA', 'version': 1, 'ct': 1},
    {'name': 'BFD', 'version': 1, 'ct': 4},
    {'name': 'SDE', 'version': 1, 'ct': 1}
]
Run Code Online (Sandbox Code Playgroud)

我想要做的是过滤掉所有 ct 为 1 的地图。过滤器方法正在查看该对象(因为我无法将其转换为地图)并检查它是否 == 为 1 ,如果是这样,它不会将其返回到流中。

Edit2:评论后,我编辑为以下内容:

List<Map<String, Object>> segmentsWithMoreVersions = segments.stream()
            .filter(m -> ((Long) m.get("ct")) != 1L)
            .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

我得到了以下信息: Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.Map

Rad*_*def 5

所以,根据你的描述,我认为你想要的过滤器是这样的:

segments.stream()
        .filter(m -> ((Long) m.get("ct")) != 1L)
        .collect(toList());
Run Code Online (Sandbox Code Playgroud)

或者明确说明谓词的类型:

        .filter((Map<String, Object> m) ->
                    ((Long) m.get("ct")) != 1L)
Run Code Online (Sandbox Code Playgroud)

在您的编辑中:您在地图中有错误的数据,或者您误解了它的表示方式。看来这segments实际上是一个List<Object[]>.

我真的没有足够的信息来帮助您修复它。

要尝试调试,您​​可以执行以下操作:

segments.stream()
        .map(Arrays::toString)
        .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

如果您没有可参考的文档,这将告诉您其中的实际内容。