관리 메뉴

제뉴어리의 모든것

배열 -> Stream 변환 본문

JAVA

배열 -> Stream 변환

제뉴어리맨 2022. 7. 26. 20:55

배열 타입 -> Stream 변환

배열의 각 요소가 Stream의 각요소가 될 수 있도록 변환 방법

  • char[] 타입 -> Stream<Character>

    char배열을 Stream으로 변환하는 방법으로,
    char 타입의 데이터들이 Stream안에 Character 요소로 변환되는 방법이다.
    Stream은 컬랙션 프레임웍의 인터페이스들과 마찬가지로 기본타입(int, char, double.......)을 요소로 가질 수없다.
char[] charArr = {'a', 'b', 'c'};

// Example 1 - the best way:
Stream<Character> charStream = new String(charArr)
        .chars().mapToObj(c -> (char) c);

 

참조 : https://stackoverflow.com/questions/10006165/converting-string-to-character-array-in-java







 

 

 

  • String[] 타입 -> Stream<String>
    List.of() 메소드로 스트림화 해주었다.
  String[] strArr = new String[]{"a","b","c"};
  Stream<String> stream = List.of(strArr).stream();

 

  • int[] 타입 -> Stream<Integer> , long[] 타입 -> Stream<Long>, double[] 타입 -> Stream[Double]

    int[], long[], double[] 타입의 배열을 Stream<배열요소> 형태로 변환해주는 방법이다.
      	//double[] -> Stream<Double>
        double[] doubleArr = new double[]{0.1, 1.2, 3.1};
        Stream<Double> doubleStream = Arrays.stream(doubleArr).boxed();
        
		//long[] -> Stream<Long>
        long[] longArr = new long[]{1,2,3};
        Stream<Long> longStream = Arrays.stream(longArr).boxed();

		//int[] -> Stream<Integer>
        int[] intArr = new int[]{1,2,3};
        Stream<Integer> intStream = Arrays.stream(intArr).boxed();

Arrays클래스의 정적 멤버 메소드인 stream의 오버로딩 상태를 보니,
숫자타입의 기본타입 배열들과 참조 타입의 배열만 받는다. 
숫자타입의 기본타입 배열이 들어왔을땐 IntStream, LongStream, DoubleStream 이런식으로 반환해 준다.

그리고 그렇게 나온 리턴 데이터를 .boxed()로 한번 깜싸서 Stream<Integer> 타입의 참조변수에 담을 수 있다.



  • Integer[] 타입 -> Stream<Integer> , Long[] 타입 -> Stream<Long>, Double[] 타입 -> Stream<Double>

    숫자 기본타입의 래퍼클래스들의 배열을 스트림으로 변환시키는 방법이다.
	   	Integer[] IntArr = new Integer[]{1,2,3};
        Stream<Integer> IntStream = Stream.of(IntArr);

        Long[] LongArr = new Long[]{1L,2L,3L};
        Stream<Long> LongStream = Stream.of(LongArr);

        Double[] DoubleArr = new Double[]{0.1,0.2,0.3};
        Stream<Double> DoubleStream = Stream.of(DoubleArr);

 

주의점

  • Stream.of(인자) 
    Stream.of() 에 인자를 가변인자로 전달하는것이 아니라, 배열로 전달할 경우 배열에 있는 요소들을 Stream의 요소로 변환 시켜 주는것이 아니라, 인자로 들어간 배열 자체(참조변수 1개)를 요소로 인식해서
    배열안에 몇개의 요소가 있던지, Stream의 요소는 1개가 된다.
    예를들어, int[] intArr = new int[]{1,2,3} 이 존재할때! intArr 자체를 인자로 넣으면 다음과 같이 된다.
    Stream<int[]> streams = Stream.of(intArr);
    그러므로 Stream.of()로 정수형 타입의 Stream을 만들기 위해선
    Stream<Integer> streams = Stream.of(1,2,3);
    으로 해야한다!
    위에 두 Stream.of는 오버로딩으로 다른 메소드이다.

    하지만 아래는 가능하다
    Integer[] arr = new Integer[]{2,3,4}; 
    Stream<Integer> arr1 = Stream.of(arr); //배열의 요소가 Stream의 요소로 만들어짐.


회고

위에 숫자 타입의 배열들을 Stream<숫자래퍼클래스> 로 변환하는 방법들을 보았지만,

굳이 Stream<숫자래퍼클래스> 형태로 쓰지 않아도 된다.

각 타입에 맞는 Stream클래스를 쓰는것이 효율적이다.

예를 들어,

int 타입 배열(int[], Integer[])은 IntStream으로 쓰는것이 효율적이고

double 타입 배열(double[], Double[])은 DoubleStream으로 쓰는것이 효육적이다.

왜냐하면 해당 클래스에 해당 각 숫자타입 변수들을 처리할 수 있는 메소드들이 정의가 되어 있기 때문이다.

'JAVA' 카테고리의 다른 글

IntStream과 Stream<Integer>의 차이  (0) 2022.08.25
내부 클래스 개념  (0) 2022.08.24
JAVA 배열에서 특정 요소 제거하기  (0) 2022.07.21
Stream을 이용한 두 배열 합치기  (0) 2022.07.21
익명 클래스 예제  (0) 2022.07.18