List를 Array로 Array를 List로 변환

  • Java
  • 2021년 5월 27일

List와 Array간의 변환은 기본적으로 for문을 이용하여 하나하나 바꾸어주면 변환이 가능하다. 하지만 for이 아닌 stream API를 이용해서 더 간편하게 바꿀 수 있는 방법을 정리한다.



1. List에서 Array로 변환

1) List -> Object[]

List<Integer> integerList = new ArrayList<>();
List<String> stringList = new ArrayList<>();

Integer[] integerArr = integerList.toArray(new Integer[integerList.size()]);
String[] stringArr = stringList.toArray(new String[stringList.size()]);
Object[] objectArr = integerList.toArray();

List에서 Wrapper객체배열로 바꾸는 것은 List의 toArray() 함수를 이용하면 쉽게 바꿀 수 있고 toArray() 의 매개변수로 변환할 객체배열을 넘겨주면 해당 타입의 배열로 바꾸어 반환된다.

만일 매개변수없이 사용한다면 Object[] 로 바꾸어 반환이 된다.


2) List -> primitive type[]

List<Integer> integerList = new ArrayList<>();

int[] arr1 = integerList.stream().mapToInt(Integer::intValue).toArray();
int[] arr2 = integerList.stream().mapToInt(x->x).toArray();   //위와 실행결과는 같다.

double[] arr3 = integerList.stream().mapToDouble(Integer::intValue).toArray();

int나 double, long과 같이 primitive 타입의 배열로 바꾸고 싶을때는 IntStream,DoubleStream,LongStream의 toArray() 를 이용하면 원시타입배열로 바꿀 수 있다.

List를 stream으로 바꾼 후 mapToInt() , mapToDouble() …와 같은 스트림api의 함수를 이용해 해당타입의 Stream으로 변경할 수 있다. 위의 함수는 map 과 동일하지만 결과물이 특정타입의 Stream으로 변환된다는 차이가 있다.


3) 다중 List -> 다중 primitive값 배열

//2차원
List<List<Integer>> list = new ArrayList<>();

int[][] arr2 = list.stream()
                .map(l -> l.stream()
                              .mapToInt(Integer::intValue)
                              .toArray())
                .toArray(int[][]::new);

//3차원
List<List<List<Integer>>> list = new ArrayList<>();

int[][][] arr3 = list.stream()
                .map( l1 -> l1.stream()
                        .map(l2 -> l2.stream()
                                        .mapToInt(Integer::intValue)
                                        .toArray())
                        .toArray(int[][]::new))
                .toArray(int[][][]::new);

다중 List를 다중 배열로 바꾸기 위해서는 map을 이용해서 계속 한 차원씩 줄이고, 1차원으로 줄여졌을때는 mapToInt를 이용해서 앞에서 설명한것 과 같이 만들어 주면 된다.

하지만 메서드 chaining이 복잡해져 헷갈릴 수 있기 때문에 for문을 작성하는게 편할 수도 있다.



2. Array 에서 List로 변환

1) Object[] -> List

Integer[] integerArr = new Integer[10];
String[] stringArr = new String[10];

List<Integer> integerList = Arrays.asList(integerArr);
List<String> stringList = Arrays.asList(stringArr);

Arrays의 asList() 함수를 이용하면 래퍼객체 배열로 쉽게 변경이 가능하다.


2) primitive[] -> List

int[] integerArr = new int[10];
double[] doubleArr = new double[10];

List<Integer> integerList1 = Arrays.stream(integerArr).boxed().collect(Collectors.toList());
List<Integer> integerList2 = IntStream.of(integerArr).boxed().collect(Collectors.toList());

List<Double> doubleList = Arrays.stream(doubleArr).boxed().collect(Collectors.toList());

primitive타입을 Wrapper객체로 바꾸어 주어야 하기 때문에 특정타입의 Stream(ex. IntStream)에 있는 boxed() 메서드를 이용하는데 이함수는 IntStream에서 Stream 로 Wrapper객체로 감싸진 Stream으로 바꾸어주는 메서드이다.

boxed() 를 사용하기 위해 Arrays.stream()으로 특정타입의 Stream으로 바꾸어주면 되고 boxed()로 바꾸어진 Stream을 collect메서드로 새로 list를 만들어 줄 수 있다.


IntStream의 boxed()메서드를 이용하기 위해 Arrays의 stream()을 이용해도 되고 IntStream의 of() 를 이용해서 InstStream을 만들 수 있다.


3) 다중 primitive배열 -> 다중 List

//2차원
int[][] arr2 = new int[][]{{1,2},{2,3}};
List<List<Integer>> list2 = Arrays.stream(arr)
              .map(tmp -> IntStream.of(tmp)
                      .boxed()
                      .collect(Collectors.toList()))
              .collect(Collectors.toList());

//3차원
int[][][] arr3 = new int[][][]{{{1,2},{2,3}}};
List<List<List<Integer>>> list3 = Arrays.stream(arr3)
                .map(tmp -> Arrays.stream(tmp)
                        .map(tmp2 -> IntStream.of(tmp2)
                                .boxed()
                                .collect(Collectors.toList()))
                        .collect(Collectors.toList()))
                .collect(Collectors.toList());

다중 배열에서 List로 변환도 위에서 설명한 다중 List -> 다중 배열 과 같이 map을 이용해 1차원이 될때까지 분해후 List로 만들어 주면된다.

여기서 IntStram.of() 는 매개변수로 1차원 배열밖에 받지 않기 때문에 3차원을 2차원 Stream으로 바꾸기 위해서는 IntStram.of가 아니라 Arrays.stream() 을 이용해야 한다.

Tags :

Related Posts

2020년 11월 회고

2020년 11월 회고

블로그 시작한지 2달째 작성해보는 회고 (첫 작성한 블로그 후기 보러가기 ) 블로그 작성을 9월을 시작으로 벌써 2달이라는 시간이 지났다. 두달동안 나름 블로그를 열심히 작성해보겠다고 게시글들을 꽤 많이 작성했는데 지금 회고를 작성하면서 돌이켜 생각해보니 잘못 하고있었구나 생각이 든다. 분명 블로그 작성을 처음 마음먹었을때는 좋은 글솜씨로 작성은...

Read More
Junit5

Junit5

  • Java
  • 2021년 1월 25일

자바 프로그래밍용 Unit 테스트 프레임워크 런타임시 Java 8이상이 필요하며 컴파일 타임시에 JAR로서 링크된다. Spring Boot를 이용하면 내부에 dependency가 포함되어 있다. 1. 구조 JUnit Platform : 테스트를 발견하고 계획을 생성하는 TestEngine 인터페이스를 갖고 있다. 이를 통해 테스트를 발견,실행,보고한다. JUnit Jupiter : TestEngine의 실제 구현체는...

Read More
Sorting Algorithm

Sorting Algorithm

1. 종류 선택 정렬 ( Selection Sort ) 삽입 정렬 ( Insertion Sort ) 버블 정렬 ( Bubble Sort ) 셸 정렬 ( Shell Sort ) 퀵 정렬 ( Quick Sort ) 힙 정렬 ( Heap Sort ) 합병 정렬 ( Merge Sort ) 기수 정렬 ( Radix Sort ) 계수(카운트) 정렬 ( Count Sort ) 트리 정렬 큐브 정렬 팀 정렬 2. 시간 복잡도 ( Big-O ) 알고리즘 최선 평균 최악 선택 정렬 Ω(n^2) Θ(n^2) O(n^2) 버블 정렬 Ω(n) Θ(n^2) O(n^2) 삽입 정렬 Ω(n) Θ(n...

Read More