모든 코딩 테스트를 보면 왜인지는 모르겠지만 답을 배열(int[], String[] 등)로 반환하라고 하는 경우가 많다.
하지만 개인적으로는 선언 시 미리 Size를 정해줘야 하는 배열보다는 Size 걱정 없이 데이터를 저장할 수 있는 Collection을 더 많이 활용하게 된다.
물론 Collection을 for문이나 for each문을 통해 모든 데이터를 순회하며 배열에 값을 넣어줘도 될 것이다.
(실제로 필자는 예전에 이런 방식으로 배열을 만들었다)
하지만 Stream을 사용한다면 데이터 순회에 걸리는 실행 시간을 조금이라도 줄일 수 있지 않을까 생각하여 정리해 보았다.
Integer.parseInt(String s)
l.intValue()
d.intValue()
(int) l
(int) d
(int) i
or i.intValue()
// String Collection to int Array
List<String> sList = new ArrayList<>();
int[] sArr = sList.stream().mapToInt(i->Integer.parseInt(i)).toArray(); // 람다식
int[] sArr2 = sList.stream().mapToInt(Integer::parseInt).toArray(); // 메서드 레퍼런스
// Long Collection to int Array
List<Long> lList = new ArrayList<>();
int[] lArr = lList.stream().mapToInt(i->i.intValue()).toArray(); // 람다식
int[] lArr2 = lList.stream().mapToInt(Long::intValue).toArray(); // 메서드 레퍼런스
// Integer Collection to int Array
List<Integer> iList = new ArrayList<>();
int[] iArr = iList.stream().mapToInt(i->i).toArray(); // 람다식
int[] iArr2 = iList.stream().mapToInt(Integer::intValue).toArray(); // 메서드 레퍼런스
// Double Collection to int Array
List<Double> dList = new ArrayList<>();
int[] dArr = dList.stream().mapToInt(i->i.intValue()).toArray(); // 람다식
int[] dArr2 = dList.stream().mapToInt(Double::intValue).toArray(); // 메서드 레퍼런스
// long Array to int Array
long[] longArr = new long[10];;
int[] intArr = Arrays.stream(longArr).mapToInt(l -> (int) l).toArray();
위 코드에서 "mapToInt" 메서드의 Parameter로써 위에서 설명한 Data Type별 int 형 데이터 변환 방법을 주입한 것을 볼 수 있다.
long[]은 mapToLong, double[]은 mapToLong을 대신 사용할 뿐 방법은 동일하므로 long[]과 double[]에 대해선 따로 기입하지 않겠다.
Integer.toString(s)
Long.valueOf(s)
Double.valueOf(d)
Collection은 Wrapper Class나 Reference Class만 T로 주입할 수 있으므로 위 3개만 알고 있으면 된다.
Collection<T>
int[] intArr = new int[10];
// Integer Collection으로 치환
List<Integer> intList = Arrays.stream(intArr).boxed().collect(Collectors.toList());
// Long Collection으로 치환
Set<Long> longSet1 = Arrays.stream(intArr).mapToObj(i->Long.valueOf(i)).collect(Collectors.toSet()); // 람다식
Set<Long> longSet2 = Arrays.stream(intArr).mapToObj(Long::valueOf).collect(Collectors.toSet()); // 메서드 레퍼런스
// Double Collection으로 치환
List<Double> doubleList = Arrays.stream(intArr).mapToObj(i->Double.valueOf(i)).collect(Collectors.toList()); // 람다식
List<Double> doubleList2 = Arrays.stream(intArr).mapToObj(Double::valueOf).collect(Collectors.toList()); // 메서드 레퍼런스
// HashSet(Collection 중 특정 클래스)으로 치환
HashSet<Integer> hashSet = Arrays.stream(intArr).boxed().collect(Collectors.toCollection(HashSet::new));
mapToLong은 Wrapper Class인 "Long"이 아닌 Primitive 자료형 "long"으로 변환하기 위한 메서드이다.
따라서 Collection<T>
에서 T로 들어갈 수 있는 Class 형태로 만들기 위해선 mapToObj를 활용해야 한다.
추가로 IntStream을 Stream<Integer>
로 변경하기 위해선 boxed()를 사용하면 된다는 것을 배웠으므로 Long<Integer>
같은 경우에는 boxed() 메서드를 활용하면 된다.
마지막으로 Set<T>
나 List<T>
가 아닌 HashSet, ArrayList같이 Collection Class를 상세히 설정하고 싶을 때 Collectors.toCollection을 사용하면 된다.
long[], double[] 또한 비슷한 방법을 사용하면 되므로 따로 기입하지 않겠다.