Java 8过滤和收集列表<map <string,object =“”>&gt;

时间:2015-05-14 20:09:52

标签: java java-8 filtering java-stream

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

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());

正如你所看到的...在filter方法中我使用了一个Object,因为我无法将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}
]

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

Edit2:评论结束后,我编辑了以下内容:

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

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

3 个答案:

答案 0 :(得分:4)

因此,根据您的描述,我认为您想要的过滤器是:

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

或明确谓词的类型:

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

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

我没有足够的信息来帮助您解决问题。

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

segments.stream()
        .map(Arrays::toString)
        .forEach(System.out::println);

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

答案 1 :(得分:1)

这对我有用......

    List<Map<String, Object>> segments = new ArrayList<Map<String, Object>>();

    List<Map<String, Object>> segmentsWithMoreVersions = segments.stream()
            .filter((Map<String, Object> s) -> {
                 return (Long) s.get("versions") > 1;
            })
            .collect(Collectors.toList());  

答案 2 :(得分:0)

好的......所以问题不在于过滤功能。感谢@Radiodef指出未经检查的转换,我发现这是导致问题的原因。所以我所做的就是改变它:

List<?> tmp = query.getResultList();
    List<Map<String, Object>> segments = new ArrayList<Map<String, Object>>();
    for(Object t : tmp)
    {
        Object[] tt = (Object[]) t;
        Map<String, Object> rMap = new HashMap<String, Object>();
        rMap.put("name", tt[0]);
        rMap.put("version", tt[1]);
        rMap.put("ct", tt[2]);
        segments.add(rMap);
    }

filter开始工作!谢谢你们!