.mapToInt()
다른 사람들의 TIL을 보며 내 글이 두서가 없다는 것을 느꼈다.
해서 이후부터는 TIL도 목적성을 가지고 작성해야겠다 라는 목표를 세운다.
그 조건을 가지는 첫 글을 작성한다.
팀 과제를 진행하며 Java
의 내장 함수의 활용하는데 있어 어려움을 느꼈다.
해서 숙련을 위한 방법이 무엇이 있을까 하다 마침 알고리즘 스터디를 겸하고 있어
선행을 조금 진행하게 되었다.
//나누어 떨어지는 숫자 배열
public int[] solution14(int[] arr, int divisor) {
int[] answer;
List<Integer> integerList = new ArrayList<>();
for (int i = 0; i < arr.length; i++) {
if(arr[i] % divisor == 0)
integerList.add(arr[i]);
}
integerList.sort(Comparator.naturalOrder());
answer = integerList.stream().mapToInt(i -> i).toArray();
return (integerList.isEmpty()) ? new int[]{-1} : answer;
}
다른 사람들처럼 화려한 코드는 작성하지 못하니 지금은 내 방식대로 걸어나가기로 했다.
다만 이 전 문제에서 sort를 선택 정렬로 직접 구현하며 n^2 복잡도를 작성하고 나니 약간 현타가 온 상태였다.
쓰레기통
for (int i = 0; i < lengthNum; i++) {
for (int j = 0; j < lengthNum -1; j++) {
if (answerArray[i] > answerArray[j]) {
sortTmp = answerArray[i];
answerArray[i] = answerArray[j];
answerArray[j] = sortTmp;
}
}
}
때문에 정렬은 하루 날 잡아 따로 공부하는게 낫겠다 라는 생각에 지금은 List
에 sort()
가 있다면 그것을 사용하기로 했는데, 문제는 여기서부터 시작되었다.
원하는 값만 받아 배열에 집어넣고 만약 배열이 비어있다면 {-1} 만 들어있는 배열을 반환
이것이 조건이었기 때문에 동적할당을 목적으로 integerList
를 생성해둔 상태에서List
를 int[]
로 바꾸는 방법은 ...
없었다. 없다기보단 내가 모르는 type인 Object[]
라는게 등장해버렸다.
열심히 강의를 듣지 않고 딴짓을 한 결과가 여기서 드러나버리나...
Object[]
Object
는 이름처럼 객체를 반환하는 클래스다. 그리고 Object[]
면 그 객체들이 담긴 배열을 리턴한다는 의미겠지.
이전에 TIL을 작성하면서 Java에서는 배열도 객체다. 라고 공부했는데, 그 이유는 배열의 super class가 Object
이기 때문이며 그로부터 메서드를 상속 받기 때문이라고 한다.
즉 아래에 소속되어 있는 자식클래스에 부모클래스를 넣으려고 하니 받아들이지 못하는것(이라고 이해했다.)
stream() ??
구글링을 하니 모든 사람들이 List
를 Array
로 변환하기 위해 이 방식을 공식처럼 사용하더라.
integerList.stream().mapToInt(i -> i).toArray();
단순히 외우는것도 좋지만 암기도 외울 포인트가 있어야 효율적이라는 조참거 것을 알기 때문에 시간을 투자해 조금 뜯어보기로 했다.
구글링을 해보니 다들 하나같이
stream 은 Java8부터 ~~~ 어쩌구 저쩌구
로 시작하던데 솔직히 별로 관심 없는 내용으로 서두를 여는 것은 내 취향도 아닐뿐더러 Java 7 이하를 내가 다룰 일이 있을것 같지도 않았다.
다만 그중에서 그래도 stream은 데이터의 흐름 (data flow) 라고 설명하는 부분은 내 이해를 위해 조금 신경써 읽었다.
처음에는 단순히
int[] = object[];
같은 호환성 문제를 해결하기 위한 도구들의 집합이라고 생각했는데 반대로 오히려
stream().mapToInt(i -> i).toArray();
이 부분이 stream
의 아주 작은 활용에 지나지 않는다는 것만 알게되었다.
단순히 TIL로 작성할만한 내용이 아니라고 판단했고 때문에 이번 TIL의 주제로 .mapToInt(i -> i)
에 주목하게 되었다.
때문에 여기서부터가 본론이라고 할 수 있을듯
mapTo*()
stream
의 메서드중 하나인 mapToInt()
는 매개변수로 함수를 받는다.
그리고 내부에 람다식으로 i -> i 가 들어가게 되는데
int[] answer;
List<Integer> integerList = new ArrayList<T>();
answer = integerList.stream().mapToInt(i -> i).toArray();
향상 for문 마냥 List<Integer> integerList를 순회하면서 내부에 있는 Integer
타입의 i
를 int
타입의 i
로 반환하게 된다.
이 과정에 Stream<Integer> integerList로 변환되게 되는데 그렇게 되면 그제서야stream
의 내장 함수인 toArray()
를 사용할 수 있게 되는 것이다.
toArray
메서드를 사용할 수 없는게 아니라 초기화 되지 않아서 밑줄이 뜬다.
Stream<T> 타입의 tmp는 stream의 메서드인 toArray()를 사용할 수 있다.
따라서, 결론적으로List
를 Array
로 전환할때는
array[] = List.stream().mapToInt(t -> t).toArray();
형태를 하나의 공식처럼 사용해야 한다는 것이다.
'TIL' 카테고리의 다른 글
2023년 11월 1일 (0) | 2023.10.31 |
---|---|
2023년 10월 31일 상속과 포함 (0) | 2023.10.31 |
2023년 10월 29일 (0) | 2023.10.30 |
2023년 10월 28일 (0) | 2023.10.30 |
2023년 10월 27일 (0) | 2023.10.28 |