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
所以,根据你的描述,我认为你想要的过滤器是这样的:
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)
如果您没有可参考的文档,这将告诉您其中的实际内容。
| 归档时间: |
|
| 查看次数: |
16655 次 |
| 最近记录: |