我有TradeChartDTO列表,我想从该列表中收集多个列表。我确实是这样。但是我想通过使用单个流来收集。我不想一次又一次地流式收集多个列表。
我做到了
private Map<String, Object> getJsonAccordingToChartApi(List<TradeChartDTO> tradeChartDTO) {
List<BigDecimal> high = tradeChartDTO.stream().map(chart -> chart.getHigh()).collect(Collectors.toList());
List<BigDecimal> low = tradeChartDTO.stream().map(chart -> chart.getLow()).collect(Collectors.toList());
List<BigDecimal> close = tradeChartDTO.stream().map(chart -> new BigDecimal(chart.getClose())).collect(Collectors.toList());
List<BigDecimal> open = tradeChartDTO.stream().map(chart -> new BigDecimal(chart.getOpen())).collect(Collectors.toList());
List<BigDecimal> volume = tradeChartDTO.stream().map(chart -> chart.getVolume()).collect(Collectors.toList());
List<BigDecimal> timestamp = tradeChartDTO.stream().map(chart -> new BigDecimal(chart.getTimestamp())).collect(Collectors.toList());
Map<String, Object> mainData = new HashMap<>();
mainData.put("t", timestamp);
mainData.put("c", close);
mainData.put("o", open);
mainData.put("v", volume);
mainData.put("h", high);
mainData.put("l", low);
return mainData;
}
TradeChartDTO.java
@Getter
@Setter
@NoArgsConstructor
public class TradeChartDTO {
private Integer timestamp;
private BigDecimal volume;
private String open;
private BigDecimal high;
private BigDecimal low;
private String close;
private BigDecimal price;
}
还有其他方法吗?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在Java 8及以上版本中,你可以通过使用Stream API的collect()
方法结合多路归约(Collectors.mapping()和Collectors.toList())来优化你的代码,以避免多次遍历列表。这样,你只需对列表进行一次流式处理即可收集到所有需要的数据。下面是一个示例:
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
public class TradeChartProcessor {
private Map<String, List<?>> getJsonAccordingToChartApi(List<TradeChartDTO> tradeChartDTOs) {
return tradeChartDTOs.stream()
.collect(Collectors.toMap(
chart -> "", // 这里用空字符串占位,因为我们最后要转换为非Map结构,这一步可以省略
chart -> Arrays.asList(
chart.getTimestamp(),
new BigDecimal(chart.getVolume()),
new BigDecimal(chart.getOpen()),
chart.getHigh(),
chart.getLow(),
new BigDecimal(chart.getClose())
),
(list1, list2) -> { throw new IllegalStateException("Duplicate keys not expected"); },
LinkedHashMap::new // 保持插入顺序
))
.entrySet().stream()
.collect(Collectors.toMap(
entry -> {
switch (entry.getKey()) {
case "0": return "t";
case "1": return "v";
case "2": return "o";
case "3": return "h";
case "4": return "l";
case "5": return "c";
default: throw new IllegalArgumentException("Unexpected key");
}
},
Map.Entry::getValue,
(list1, list2) -> list1, // 如果有重复key的情况,这里定义如何合并,但根据逻辑应该不会有重复
LinkedHashMap::new // 保持插入顺序
));
}
public static void main(String[] args) {
TradeChartProcessor processor = new TradeChartProcessor();
List<TradeChartDTO> data = // 初始化你的TradeChartDTO列表
Map<String, List<?>> result = processor.getJsonAccordingToChartApi(data);
System.out.println(result);
}
}
这段代码首先将每个TradeChartDTO
对象映射为一个包含所有字段值的列表,然后通过键(这里简化处理,实际应用中可能需要更合理的键策略)收集这些列表到一个映射表中。最后,它调整了这个映射表的键名,并返回最终结果。
请注意,上述示例中的键处理("0"
到"5"
)是为了演示目的而简化的,实际上你可以直接在收集阶段构建期望的键值对,避免后续的映射操作。此外,由于原始问题中提到的是直接构建Map
而非保留中间的List
结构,所以上述示例可能与需求稍有偏差。如果目标是直接构造出特定格式的Map
,则可以直接在流处理过程中完成转换,无需先转为多个列表再重组。