【发布时间】:2019-02-22 13:45:47
【问题描述】:
这个问题很熟悉,但我的问题有点奇怪。
这是我拥有的 POJO:
public class POJO implements Serializable {
@JsonProperty("ID")
private UUID id;
@JsonProperty("Name")
private String name;
// getters and setters
}
我正在尝试使用以下代码过滤此 POJO 的列表:
List<POJO> pojoList = getListOfPojosFromSomeMethod();
List<POJO> filteredPOJO = pojoList.stream()
.filter(p -> p.getName().equals("POJOName"))
.collect(Collectors.toList())
我无法过滤列表。我得到以下异常:
java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to com.models.POJO
at java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:174)
at java.util.ArrayList$ArrayListSpliterator.forEachRemaining (ArrayList.java:1374)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at
java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at
java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
我也尝试过使用地图:
List<POJO> pojoList = getListOfPojosFromSomeMethod();
List<POJO> filteredPOJO = pojoList.stream()
.filter(p -> p.getName().equals("POJOName")
.map(p -> new POJO(p))
.collect(Collectors.toList());
同样的例外。没有任何改变。我在某处读到异常是因为 Jackson 序列化。
如何同时使用流和 Jackson 过滤列表?我找不到解决方案。
提前致谢。
【问题讨论】:
-
这与流或收集等无关。这个问题被称为heap pollution,是关于欺骗编译器,使其认为你的
pojoList是List<POJO>实际上是List<LinkedHashMap<String, Object>>(当没有足够的可用类型信息时,这是 JSON 序列化/反序列化库使用的类型)。提示:如果你在getListOfPojosFromSomeMethod方法中使用了奇怪的强制转换,我敢打赌这就是问题所在。 -
@FedericoPeraltaSchaffner 我正在从
getListOfPojosFromSomeMethod方法内的 Hashmap 中检索 List。一旦我在检索它们时使用了正确的转换,流就可以无缝运行!
标签: java serialization java-8 stream jackson