보통 배열을 List로 바꿀 때 Arrays.asList
를 사용하는 경우가 있을텐데, Char[]
에 대해서는 우리가 원하는 것처럼 List<Character>
가 되지 않고 List<char[]>
로 나온다.
왜 그런 것일까?
Arrays.asList
메서드는 primitive 타입을 Wrapper 클래스 (ex> int to Integer, char to Character) 로 형변환을 해주지 않는다.
그렇기에 그냥 통째로 char[], int[]
로 리스트 변환을 해버리는 것이다.
따라서 위와 같은 primitive 타입은 다른 변환과정을 거쳐야 한다.
두 가지 방법이 있는데,
오늘은 stream으로 변환하는 방법만 알아보도록 하겠다. (java 8 이후로만 가능)
char[] charArr = {'a','b','c'};
int[] intArr = {1, 2, 3};
List<Character> charList = IntStream
.range(0, charArr.length)
.mapToObj(i -> charArr[i])
.collect(Collectors.toList());
List<Integer> intList = Arrays.stream(intArr)
.boxed()
.collect(Collectors.toList());
char는 IntStream으로 변환한 뒤 mapToObj를 통해서 Wrapper 클래스로 형 변환하고,
int는 boxed를 통해서 Wrapper 클래스로 변환한다.
관련해서 보다보니 궁금한 것이 하나 생겼다.
왜 char 배열은 Arrays.stream
메서드가 아닌 IntStream을 이용해서 범위로 처리할까?
이유는 stream에 존재하는 primitive 타입의 stream은 int, double, long만 존재하기 때문이다.
그렇기에 mapToObj
를 통해서 wrapper 클래스로 형변환을 하나하나 시켜주는 것이다.