욱 연구소

슬기로운 개발생활

프로그래밍/Java

Java 8기준 stream collect에서 unmodifiable객체 만들기

wook-lab 2021. 1. 6. 01:17
반응형

Java11이 LTS로 선정된지 꽤 시간이 지나 현재는 Java 15까지 릴리즈 되었다
(심지 Java16, 17이 개발이 진행중인듯 하다)

개발을 하면서 Java8 과 Java11을 섞어쓰는 시점이 요즘인거 같다.
(Java11 쓰는게 빠른건 아닌거 같고 늦은건가 싶기도 하고..)

개발을 하면서 불변(unmodifiable)한 객체를 필요할 때 생성하게 되는데
Java11에서는 편하게 작성했던 소스가 Java8로 하려니 돌아가지 않아 확인을 하게 되었다.

Stream 에서 종결 메서드인 collect()시에 unmodifiable한 객체를 만드는 방법에 대해
Java8과 Java11의 차이점을 알아보자

// Java11
class BlogTest {

    @Test
    void test() {
        List<TestVo> testVoList = new ArrayList<>();
        Map<Long, TestVo> result = testVoList.stream()
            .collect(Collectors.toUnmodifiableMap(TestVo::getId, Function.identity()));
    }
}

위의 소스에서 보듯 .collect()메서드에서 Collectors.를 통해 바로 불변객체를 생성할 수 있다. (Java 11)

Java8의 경우에는 Collectors에서 toUnmodifiableMap을 제공하지 않는다.
하지만 아래와 같이 Collectors.collectingAndThen()을 이용하여 불변객체를 생성할 수 있었다.

class BlogTest {

    @Test
    void test() {
        List<TestVo> testVoList = new ArrayList<>();

        Map<Long, TestVo> result = testVoList.stream()
            .collect(
                Collectors.collectingAndThen(
                    Collectors.toMap(TestVo::getId, Function.identity()), 
                    Collections::unmodifiableMap
                )
            );
    }
}

Collectors.collectingAndThen 메서드를 이용하여
첫 번째 매개변수로 Collectors.toMap()를 통해 일반적인 맵을 생성하도록 하고
그 이후에 Function 으로 Collections.unmodifiableMap을 통해 불변한 맵 객체를 반환하도록 하였다.

Map 뿐만아니라 List나 Set도 방식은 동일하다
collectingAndThen으로 넘겨 Collections의 unmodifiableList나 unmodifiableSet을 사용하면 된다.

Java11, Collectors 메서드
Java8, Collections (Collectors.collectingAndThen에서 사용)

 

 

반응형