Java 16 주요 변경점

JDK 16

1. Stream 클래스에 메서드 추가

 

toList()

스트림의 요소들을 순서대로 List 에 담아 반환한다.

Java 16 이전에는 collect(Collectors.toList()) 를 사용했지만, 좀더 간결하게 표현 가능해졌다.

 

 

mapMulti()

mapMulti() 를 알아보는 김에..

map(), flatMap(), multiMap() 를 알아보겠다. (map, flatMap 은 Java 8)

 

map()

스트림 내부의 요소 하나하나에 접근해서...

파라미터로 넣어준 함수를 실행한 뒤 최종연산에서 지정한 형식으로 반환해주는 메서드이다.

 

flatMap()

스트림 내부의 각 요소를 한번 더 또다른 스트림으로 변환하고,

이렇게 생성된 모든 스트림을 하나의 스트림으로 결합한다. (중첩된 데이터 구조를 평탄화 하는데 효과적)

ex) List의 List 또는 Stream 의 Stream 처럼 중첩된 구조를 단순한 구조로 변환

List의 List 로 중첩된 구조를 flatMap() 메서드를 통해 평탄화 한 코드이다.

 

이해를 돕기 위해 flatMap() 을 사용하지 않고 map() 메서드만을 이용해 동일한 결과를 만든 코드이다.

 

 

한번 더 이해를 돕기 위해 이번엔 동일한 input 으로 다른 output 을 만들어 보았다.

 

multiMap()

각 요소를 여러 요소로 변환하는 연산이다.

 

 

Stream의 mapMulti() 는 값을 하나 받아서 여러개를 생성할 수 있다.

flatMap() 의 기능도 mapMulti() 를 활용하면 쉽게 구현할 수 있다...

 

이해를 돕기위해 2개의 예시를 작성했다.

 

multiMap() 메서드의 람다 표현식은 두개의 인자를 받는다.

첫번째 인자는 현재 요소가 매핑된다.

두번째 인자는 Consumer 타입 인스턴스가 들어가는데..

메서드 사용자는 인스턴스를 직접 만들 필요는 없다.

(Consumer 인스턴스는 multiMap() 메서드 내부에서 자체적으로 생성)

 

단순히 해당 Consumer 의 인스턴스에 accept() 메서드 인자로...

최종 리스트에 들어갈 값을 집어 넣어 주면 된다.

 

참고>

첫번째 예시에서 볼 수 있는 것 처럼, 첫번째 인자에는 현재 요소의 타입을 사용하면되고

최종 리스트의 요소 타입이 될 것은 Consumer의 Generic 타입으로 넣어주면 된다.

 

 

2. instanceof 와 패턴 매칭

Java 16 부터는 instanceof 와 패턴 매칭을 결합하여 사용할 수 있게 되었다.

 

예시 코드로 알아보자

기존의 instanceof 사용법에서는 객체의 타입을 확인한 후

해당 객체를 해당 타입으로 명시적 형변환을 수행해야 했다.

 

Java 16 부터 instanceof 연산자와 패턴 매칭을 결합하여 코드를 단순화 할 수 있게 되었다.

obj 가 String 타입인지 확인하고 맞다면, obj 를 String 타입으로 형변환 후 str 에 할당한다.

이때 str 을 패턴 변수라고 부른다.

 

위와 같은 코드도 가능하다.

첫번째 if 문에서.. 패턴 변수 str1 을 바로 사용하는 것(isBlank)을 볼 수 있다.

 

두번째 if 문에서는 obj 가 String 타입이 아닌 경우 if 문 내부의 코드를 실행하게 된다.

이 경우, str2 를 할당 받지 않는다. if 문 내부에서 str2 를 참조 할 수 없다는 것이다.

여기서.. 흥미로운점은

obj 가 String 타입인 경우엔 if 블록 외부를 수행하는데 이때 str2 가 할당이 된다.

그래서 if 블록 외부에서 str2 패턴 변수를 사용할 수 있다.

 

3. record 클래스

Java 16 에 추가된 record 클래스의 설명은 이미 포스팅한 이력이 있으므로 url 로 대체

https://starryeye.tistory.com/150

 

 

'Java' 카테고리의 다른 글

Java NIO 와 동기 non-blocking + CPU 자원  (0) 2023.11.15
Java IO 와 동기 blocking + CPU 자원  (0) 2023.11.15
Java 11 ~ 15 주요 변경점  (0) 2023.05.19
Java 9, 10 주요 변경점  (0) 2023.05.19
불변 객체 validation  (1) 2023.05.07