【问题标题】:Nested Object Transformation using Stream API Java 8使用 Stream API Java 8 的嵌套对象转换
【发布时间】:2017-03-16 18:14:42
【问题描述】:

我有一个这样的类来存储来自 REST-API 调用的 APIResponse

class DataSet {
        public String ID;    
        List<DataPoint> dataPoints;
}

class DataPoint{
       DateTime timeStamp;
       Double value;
}

我有一个 DataSet 的 ArrayList,需要转换成这样的东西

[{x: timestamp1, y: value1}, {x: timestamp2, y: value2},... {x: timestampn, y: valuen}]

对于 ArrayList 中的每个元素。

我正在学习 Java 8 的 Stream API,并希望使用相同的方法。 想知道如何使用 Stream API java 8 的 lambda 表达式得出输出。

目前,期望的输出是通过使用 for-each 的传统方式实现的,即:

List<ArrayList<Map<String, Object>>> transformedObject = new List<ArrayList<Map<String, Object>>>();
        for(DataSet m : apiResponseArray){  
            ArrayList<Map<String, Object>> dataobj = new ArrayList<Map<String, Object>>();      
            List<DataPoint> listData =m.getdataPoints();
            for(DataPoint d : listData)
            {
                Map<String, Object> dataMap = new LinkedHashMap<String, Object>();                  
                dataMap.put("x", d.getTime(););
                dataMap.put("y", d.getValue());
                dataobj.add(dataMap);
            }
            transformedObject.add(dataobj);         
        }
Gson gson = new Gson();
return gson.toJson(transformedObject);

提前致谢!!!

【问题讨论】:

  • 你可以对apiResponseArray进行平面映射,但我怀疑它会显着改进你的代码。
  • @shmosel 我怎样才能让流以这种方式返回地图的数组列表列表?
  • @shmosel 你还有什么建议可以提高性能?
  • 是否存在性能问题?你什么都没提。
  • @shmosel 是的,转换需要相当多的时间。由于响应很大,我认为使用流可能会有所帮助。如果我的想法不对,请原谅我。

标签: java lambda java-8 java-stream collectors


【解决方案1】:

内部流的一种可能方式(如果您真的想要地图列表:))

private Map<String, Object> map(DataPoint dataPoint) {
    Map<String, Object> map = new LinkedHashMap<>();
    map.put("x", dataPoint.timeStamp);
    map.put("y", dataPoint.value);
    return map;
}


List<List<Map<String, Object>>> transformedObject = dataSets.stream()
            .map(
                    dataSet -> dataSet.dataPoints.stream()
                        .map(this::map)
                        .collect(Collectors.toList())
                )
            .collect(Collectors.toList());

【讨论】:

  • 与传统方法相比,您对通过这种方法提高性能有何看法?
  • @BabyHulk 没有性能影响,但您在原始问题中没有提及。您只想将其重写为流。
  • 可能循环不是瓶颈,而是@shmosel 所写的序列化本身。当然,您可以使用并行流,但我对在您的情况下提高性能表示怀疑。
  • 但有趣的是,虽然肯定不是预期的,但流在测试时提供了某种性能改进。寻找可以归因于它的适当解释。 @rejthy
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多