자바 리스트에서 필요한 위치의 데이터만 슬라이스 하는 방법을 알아보겠습니다.
효율적인 데이터 가공과 빠른 성능은 코드 품질을 높이기 위해 꼭 필요합니다.
for-loop
는 전통적인 코드이면서 성능이 검증된 방식입니다.
그래서 대용량의 데이터를 변환 할 때 우선 고려됩니다.
package com.devfoxstar.codingtest; import java.util.ArrayList; import java.util.List; public class Slice { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); list.add("E"); List<String> subList = new ArrayList<>(); for (int i = 2; i < 4; i++) { subList.add(list.get(i)); } System.out.println(subList); //[C, D] } }
subList
는 간단하게 사용할 수 있지만, 메모리 문제가 있습니다.
변환 과정에서 부모 객체의 값을 메모리에 기억하기 때문입니다.
따라서 대용량의 데이터를 처리하는 함수로는 적합하지 않습니다.
package com.devfoxstar.codingtest; import java.util.ArrayList; import java.util.List; public class Slice { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); list.add("E"); List<String> subList = new ArrayList<>(list.subList(2,4)); System.out.println(subList); //[C, D] } }
자바8 부터 추가된 Stream API
는 Lambda
를 활용해서 간편하게 데이터 가공이 가능합니다.
단 한줄의 코드로 간단하게 구현이 가능합니다.
물론 Stream API
는 아직 전통적인 for-loop
방식에 비하면 성능이 떨어집니다.
그래서 대용량의 데이터를 처리하거나 복잡한 변환이 필요한 경우에는 성능 체크가 필수입니다.
package com.devfoxstar.codingtest; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; public class Slice { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("A"); list.add("B"); list.add("C"); list.add("D"); list.add("E"); List<String> subList = list.stream().skip(2).limit(2).collect(Collectors.toList()); System.out.println(subList); //[C, D] } }
리스트 데이터를 가공하는 방식은 다양합니다.
최근에는 Stream API + Lambda 조합이 필수처럼 사용되고 있습니다.
하지만 상황에 따라서 성능 저하가 발생할 수 있습니다.
그래서 대용량의 데이터를 처리한다면, 선택한 방식의 성능 체크는 필수입니다.
그리고 여전히 for-loop 연산은 좋은 성능으로 자주 활용되고 있습니다.