[Java] Stream을 활용한 List 병합하기

Donghyun Kim·2023년 6월 29일
1

같은 타입을 가진 List 병합하기

// List<User> 타입의 List가 여러개 있을 때
List<User> user1 = repository.getUsers(a);
List<User> user2 = repository.getUsers(b);
List<User> user3 = repository.getUsers(c);

List<User> mergedUsers = mergeLists(user1, user2, user3);

// 파라미터로 해당 List를 n개 받아 Stream.of 메서드와 flatMap을 통해 병합한다.
private static List<User> mergeLists(List<User>... lists) {
    return Stream.of(lists)
            .flatMap(List::stream)
            .collect(Collectors.toList());
}

다른 타입을 가진 List 병합하기

List<K8sPodMetricVo> k8sPodMetricVos = gson.fromJson(k8sResourceItemJson, new TypeToken<ArrayList<K8sPodMetricVo>>() {
}.getType());
List<PodEntityVo> podEntityVos = gson.fromJson(podEntityJson, new TypeToken<ArrayList<PodEntityVo>>() {
}.getType());
List<NodeEntityVo> nodeEntityVos = gson.fromJson(nodeEntityJson, new TypeToken<ArrayList<NodeEntityVo>>() {
}.getType());

// 3개의 List를 하나의 List<Vo> 형태로 데이터 병합
List<PodMergeDataVo> podMergeDataList = k8sPodMetricVos.stream()
        .flatMap(K8sPodMetricVo -> podEntityVos.stream()
                .filter(PodEntityVo -> K8sPodMetricVo.getMetadata().getName().equals(PodEntityVo.getPodName()))
                .map(PodEntityVo -> new PodMergeDataVo(K8sPodMetricVo, PodEntityVo, null)))
        .flatMap(PodMergeDataVo -> nodeEntityVos.stream()
                .filter(NodeEntityVo -> PodMergeDataVo.getPodEntity().getNodeName().equals(NodeEntityVo.getNodeName()))
                .map(NodeEntityVo -> new PodMergeDataVo(PodMergeDataVo.getK8sPodMetric(), PodMergeDataVo.getPodEntity(), NodeEntityVo))
        )
        .collect(Collectors.toList());
profile
"Hello World"

0개의 댓글