Java 8 列表的过滤和收集<Map<String, Object>>
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的Map。
filter 方法正在查看该对象(因为我无法将其转换为 Map)并检查它是否 == 为 1,如果是,它不会 return 它到流。
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
所以,根据你的描述,我想你想要的过滤器是这样的:
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
成功了!谢谢大家!
public static void main(String[] 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=Y}]
好的,所以我有一个地图列表,我想过滤然后收集到另一个地图列表。每次我通过该过程处理该列表时,我都会得到一个对象列表...帮助?!
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的Map。 filter 方法正在查看该对象(因为我无法将其转换为 Map)并检查它是否 == 为 1,如果是,它不会 return 它到流。
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
所以,根据你的描述,我想你想要的过滤器是这样的:
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
成功了!谢谢大家!
public static void main(String[] 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=Y}]