开发者社区 问答 正文

如何使用Java 8流从List <TradeChartDTO>收集多个列表?

我有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;
}

还有其他方法吗?

展开
收起
垚tutu 2019-11-28 19:24:31 957 分享 版权
阿里云 AI 助理回答

在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,则可以直接在流处理过程中完成转换,无需先转为多个列表再重组。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: