我有一个像下面这样的lambda表达式。我想问的是,铸造方法参数有什么简单的方法或最佳实践吗?
results.forEach(
(result) ->
{
((JSONObject)result).put("test", "test");
((JSONObject)result).put("time", System.currentTimeMillis());
otherList.add(((JSONObject)result));
}
);
当我尝试更改输入类型时
(JSONObject result) ->
我收到了以下错误;
incompatible types: Consumer<JSONObject> cannot be converted to Consumer<? super Object>
答案 0 :(得分:2)
该错误消息向您说明,从编译器的角度来看,您的列表从技术上讲可能包含不属于类JSONObject
的元素。因此,您不能在此处使用Consumer<JSONObject>
。 lambda (JSONObject result) -> ...
实际上是 这样的不兼容的使用者。
假设您无法控制results
的元素类型,则可以在使用元素之前将它们映射到正确的类型。如果您期望除JSONObject
元素之外的其他内容,则可以使用filter()
方法来省略所有不兼容的元素,而仅处理JSONObject
实例。
results.filter(JSONObject.class::isInstance) // only needed if you expect non JSONObject elements, too
.map(result -> (JSONObject) result)
.forEach(result -> {
result.put("test", "test");
result.put("time", System.currentTimeMillis());
otherList.add(((JSONObject)result));
});
答案 1 :(得分:0)
根据评论提出的Fabian,您可能已初始化results
List
或List<Object>
您可以做的是,您可以List<JSONObject>
results.forEach(
(result) ->
{
result.put("test", "test");
result.put("time", System.currentTimeMillis());
otherList.add(result);
}
答案 2 :(得分:-1)
您可以以这种方式使用流函数在第一步进行类型转换,然后在后续步骤中进行查询-
List<String> collect = Lists.newArrayList(obj.get("graph").getAsJsonObject().get("nodes").getAsJsonArray()).stream().
map(x -> (JsonObject) x).
map(x -> {
String res = "";
try {
res = CommonUtils.getAsString(x,"modelKey");
} catch (Exception e) {
}
return res;
}).collect(Collectors.toList());