【发布时间】:2016-09-08 12:10:55
【问题描述】:
我有一个如下所示的 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>
【问题讨论】:
-
如消息所述,这些类型不兼容。为什么不直接引入局部变量?
-
@OliverCharlesworth 起初我认为(创建一个新的局部变量)但是如果我有 5-6 个输入怎么办?我需要为所有这些变量创建一个新变量吗?
-
这个问题不是 lambdas 独有的——它适用于任何方法。 (也就是说,如果你有一个有 5-6 个输入的 lambda,可能会发生一些奇怪的事情!)
-
正确参数化列表:使用
List<JSONObject>而不是List或List<Object>,这不是问题... -
如果由于某种原因您无法正确键入列表,您可以使用:
results.stream().map(JSONObject.class::cast).forEach((JSONObject result)->{ … });。在标准的 Java API 中,没有超过两个参数的场景……