如何将对象流映射到特定类型

时间:2014-08-03 20:13:53

标签: java java-8

我有JSONArray个对象,我想将每个对象映射到JSONObject

我试过了:

JSONArray array; //my json array
array.stream().map(obj -> (JSONObject) obj).forEach((JSONObject prof) -> {
    //code
});

然而,类型已被Object封装,因此我似乎无法将其删除。如何使用Java 8流实现这一目标?

2 个答案:

答案 0 :(得分:6)

这里有一些问题。 JSONArrayArrayList的原始子类型。因此,它继承的方法也是原始的,所有类型参数的使用都被删除并减少到Object。只是这应该告诉你事情将来不会安全。

调用

array.stream().map(..)

是生的。因此,Function接受的map也是原始的。返回的Stream也将是原始的。因此,调用的forEach将在Object上运行,从而删除结果类型。除了在操作之间进行投射之外,你无能为力。像

这样的东西
Stream stream = array.stream().map(obj -> (JSONObject) obj);
((Stream<JSONObject>) stream).forEach((JSONObject prof) -> {
    // code
});

但这绝不是安全的(除非你知道JSONObject中只有JSONArray个对象。这带给我们......

  

我有一个JSONArray对象,我想将每个对象映射到一个JSONObject。

您必须决定如何进行此映射。 JSONArray可以包含JSONObject,字符串,数字等。只需转换为JSONObject即可。

答案 1 :(得分:3)

您的代码无效,因为ArrayList的基本类型JSONArray没有指定类型参数。您可以通过强制转换来“添加”一个:

((List<?>)array).stream().map(obj -> (JSONObject) obj).forEach((JSONObject prof) -> {
    //code
});

但是在你的代码示例中,我真的没有理由不使用这样的一个lambda表达式:

array.stream().forEach(obj -> {
    JSONObject prof = (JSONObject) obj;
    //code
});