μλ°μμ λ°μ΄ν° 리μ€νΈλ₯Ό νΌλ΄ ν μ΄λΈλ‘ λ§λ€κΈ°
Data@Getter @Setter public class Data { private String date; private String id; private String report; private Double sum; private Double avg; }
PivotData@ToString @Getter @Setter @JsonNaming(value = PropertyNamingStrategies.UpperSnakeCaseStrategy.class) @SuppressWarnings({"squid:S116"}) public class PivotData { @JsonProperty("date") private String date; @JsonProperty("id") private String id; private Double POWER; private Double ENERGY; private Double TEMP; private Double HERTZ; }
PivotDataConverter@UtilityClass public class PivotDataConverter { private static final ObjectMapper MAPPER = new ObjectMapper(); private static final Map<String, String> AVG_REPORTS = Set.of("POWER", "TEMP", "HERTZ").stream() .collect(Collectors.toUnmodifiableMap(s -> s, s -> s)); public static List<PivotData> from(List<Data> list) { return MAPPER.convertValue(list.stream() .collect(Collectors.groupingByConcurrent(data -> Pair.of(data.getDate(), data.getId()))) .entrySet() .parallelStream() .map(entry -> { Map<String, Object> row = entry.getValue() .stream() .collect(Collectors.toMap(Data::getReport, data -> AVG_REPORTS.containsKey(data.getReport()) ? data.getAvg() : data.getSum())); row.put("date", entry.getKey().getLeft()); row.put("id", entry.getKey().getRight()); return row; }).toList(), new TypeReference<>() { }); } }
λ μ§μ 리ν¬νΈ νλͺ©μΌλ‘ μ΄λ£¨μ΄μ§ μκ³μ΄ λ°μ΄ν°μ ν΅κ³ μ 보λ₯Ό λ μ§μ 리ν¬νΈ νλͺ©λ³ κ° ννλ‘ μ΄λ£¨μ΄μ§λ νΌλ΄ ν μ΄λΈ 리μ€νΈλ‘ λ°κΏλ³΄μμ΅λλ€. λ μ§λ₯Ό ν¬ν¨ν νλ μ΄μμ νλλ‘ κ·Έλ£Ήν λλ©΄μ 리ν¬νΈ νλͺ©μ λ°λΌ ν©κ³ λλ νκ· κ°μ μ¬μ©ν΄μΌ ν©λλ€. Collectors.groupingBy λ₯Ό μ¬μ©ν΄μ λ°μ΄ν° 리μ€νΈλ₯Ό λ μ§ κΈ°μ€μΌλ‘ κ·Έλ£Ήννκ³ κ° λ¦¬ν¬νΈ νλͺ©μ νλμ Map μΌλ‘ μμ±νκ³ λμ ObjectMapperλ₯Ό μ¬μ©ν΄ νΌλ΄λ ννμ ν΄λμ€λ₯Ό κ°μ§ 리μ€νΈλ‘ λ³ννμ΅λλ€. μ μμμμ μ λ ₯λμ λν΄μλ§ ν©κ³λ₯Ό μ¬μ©νμ§λ§ μ€μ λ‘λ λλΆλΆμ 리ν¬νΈ νλͺ©μ λν΄ ν©κ³κ°μ μ¬μ©νκ² λλ―λ‘ νκ· κ°μ μ¬μ©ν΄μΌνλ 리ν¬νΈ νλͺ©λ§μ λ³λλ‘ κ΄λ¦¬νλλ‘ μ½λλ₯Ό μμ±νμ΅λλ€.