Java.util 패키지의 Arrays 클래스를 이용하면 간단히 Stream으로 변경할 수 있다.
위에서와 int 외에도 다양한 숫자형 strem 변환을 지원한다.
public class Example {
public static void main(String[] args) {
toStream(new int[]{1, 2, 3, 4, 5});
}
private static void toStream(int[] array) {
IntStream stream = Arrays.stream(array);
}
}
String의 경우 제네릭 T 타입 배열로 인자값이 들어가는 케이스로 변환된다.
private static void toStream(String[] array){
Stream<String> stream = Arrays.stream(array);
}
그런데 캐릭터 배열 char[] array 를 변환하려고 하면 다음과 같은 컴파일 에러가 발생한다.
왜 이러한 에러가 발생하는 것일까?
그 이유는 앞서 언급한 제네릭 타입과 관련이 있다.
char은 원시 타입으로 제네릭 호환이 되지 않는다. 제네릭은 객체형을 타입 파라미터로 받을 수 있으므로 원시타입은 전달되지 않는다. String은 원시타입처럼 사용되지만 실제로 객체 타입이기 때문에 호환이 되었던 것이다.
그렇다면 char의 래퍼 클래스로서 Character로 만들어진 배열을 전달하면 어떨까?
private static void toStream(Character[] array){
Stream<Character> stream = Arrays.stream(array);
}
당연히 무리 없이 생성되는 것을 볼 수 있다.
그런데 원시타입으로 구성된 char[]를 활용해야 될 때가 있다. 그럴때 char[]을 스트림으로 변환해서 사용할 필요가 있으면 어떻게 해야할까?
그럴 때는 Instream을 사용하면 된다.
다음과 같이 할 수 있다.
1) 먼저 IntStream을 연다.
2) IntStream의 각 요소, 즉 숫자를 char와 매핑한다.
3) 이후에는 이제 똑같이 스트림의 기능을 사용할 수 있다. 즉, Stream<Character>가 된다.
진행 과정
1)
IntStream intStream = IntStream.range(0, array.length);
2)
Stream<Character> characterStream = intStream.mapToObj(i -> array[i]);
3)
characterStream.filter(// todo 원하는 처리...)
이를 활용해 캐릭터 배열에서 중복 값을 찾는 예시 코드를 다음과 같이 작성할 수 있다.
return IntStream.range(0, wheel.length).mapToObj(i-> wheel[i]).anyMatch(alphabet -> alphabet == current);
'질문 연습' 카테고리의 다른 글
충돌 없는 완벽한 해싱이 존재한다고 ? (퍼펙트 해싱 개념 및 사례, 최적화 방법에 대해서) (4) | 2024.11.02 |
---|---|
로깅 추적을 위한 AOP 적용과 이후 성능 차이 그리고 why ?! (0) | 2023.12.14 |
컴퓨터는 실제로 배열의 데이터에 index로 접근할까? (1) | 2023.11.24 |