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을 사용하면 된다.
'프로그래밍 > Java' 카테고리의 다른 글
Mac OS에서 Java(temurin JDK) 설치하기 (0) | 2022.04.21 |
---|---|
VO와 DTO 는 다르게 부르는 같은 말? (0) | 2022.01.27 |
Constant Interface (0) | 2022.01.20 |
junit4 vs. junit5 어노테이션 비교(기본) (0) | 2021.01.10 |
JAVA log4j와 log4j2 외부경로 설정 (0) | 2021.01.07 |