如何投射lambda方法参数?

时间:2016-09-08 12:10:56

标签: java lambda java-8

我有一个像下面这样的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>

3 个答案:

答案 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 ListList<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());