繁体   English   中英

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

[英]Java 8 Filter and Collect of List<Map<String, Object>>

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

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

如您所见...在过滤器方法中,我使用了一个对象,因为我无法将 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 的地图。过滤器方法正在查看该对象(因为我无法将其转换为地图)并检查它是否 == 为 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 Caused by: java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to java.util.Map

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

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

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

这对我有用...

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

好...所以问题不在于过滤器功能。 感谢@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工作了! 多谢你们!

公共静态无效主(字符串 [] args){

    List<Map<String, Object>> ls = new ArrayList<Map<String, Object>>();
    Map<String, Object> mp = new HashMap<String, Object>();
    mp.put("1", "One");
    mp.put("2", "N");
    Map<String, Object> mp1 = new HashMap<String, Object>();
    mp1.put("1", "Two");
    mp1.put("2", "Y");
    ls.add(mp);
    ls.add(mp1);
    
    List<Map<String, Object>> ls2 = new ArrayList<Map<String, Object>>();
    Map<String, Object> mp2 = new HashMap<String, Object>();
    mp2.put("1", "One");
    mp2.put("2", "N");
    Map<String, Object> mp21 = new HashMap<String, Object>();
    mp21.put("1", "Two");
    mp21.put("2", "N");
    ls2.add(mp2);
    ls2.add(mp21);
    
    List<Map<String, Object>> segmentsWithMoreVersions = ls.stream()
            .filter(( s) -> {
                 return (boolean) ((String) s.get("2")).equalsIgnoreCase("Y");
            })
            .collect(Collectors.toList()); 
    
    System.out.println(segmentsWithMoreVersions);
    
    /*ls2.forEach(map -> {
        
        
        
    });*/
    
    
    
    
    
    
    
    
}

输出 - [{1=2, 2=Y}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM