首页 > 解决方案 > 如何从列表中收集多个列表通过使用 java 8 流?

问题描述

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

有没有其他方法可以做到这一点?

标签: javajava-8java-stream

解决方案


我唯一知道要做的就是引入相同键和映射函数的映射,以帮助您转换 DTO:

Map<String, Function<TradeChartDTO, Object>> functionMap = new HashMap<>();
functionMap.put("v", TradeChartDTO::getVolume);
functionMap.put("l", TradeChartDTO::getLow);
functionMap.put("h", TradeChartDTO::getHigh);
functionMap.put("c", chart -> new BigDecimal(chart.getClose()));
functionMap.put("o", chart -> new BigDecimal(chart.getOpen()));
functionMap.put("t", chart -> new BigDecimal(chart.getTimestamp()));

Map<String, Object> mainData = functionMap.entrySet().stream().collect(Collectors.toMap(
    Entry::getKey,
    e -> tradeChartDTO.stream().map(e.getValue()).collect(Collectors.toList())
));

真正的好处是值得怀疑的,但是,您节省了一半的行。这是一个偏好问题。


推荐阅读