오늘 이거 알았네요/Java

[Java] Stream.of() vs Arrays.stream()

로그관리자 2023. 2. 23. 10:47
728x90

 

 

배열의 Stream 생성

 

Arrays.Stream()

Stream(T[] array)

  • 매개변수로 전달된 배열 요소를 소스로 사용하여 순차 Stream을 반환
  • 기본 타입인 int, long, double형을 저장할 수 있는 배열에 관한 스트림이 별도로 정의되어 있다.
    → java.util.stream 패키지의 IntStream, LongStream, DoubleStream 인터페이스

   

+ IntStream나 LongStream 인터페이스에는 range()와 rangeClosed() 메소드가 정의되어 있다.


       range() → 명시된 시작 정수를 포함하지만, 명시된 마지막 정수는 포함하지 않는 스트림을 생성
       rangeClosed() → 명시된 시작 정수뿐만 아니라 명시된 마지막 정수까지도 포함하는 스트림을 생성

IntStream stream1 = IntStream.range(1, 4);
stream1.forEach(e -> System.out.print(e + " "));
System.out.println(); // 1 2 3 

 

IntStream stream2 = IntStream.rangeClosed(1, 4);
stream2.forEach(e -> System.out.print(e + " ")); // 1 2 3 4

 

Stream.of()

Stream of(T… values)

  • 가변 매개변수(variable parameter)를 전달받아 스트림을 생성한다.

 

가변 매개변수 ?

자바는 오버로딩이라는 기능이 구현되어 있어 매개변수의 개수와 타입이 달라도 같은 이름의 메소드명으로 동일 기능을 구현 할 수 있다.

파라미터 개수가 다르면 다른 메소드로 인식한다.

오버로딩의  조건
1. 메소드 이름이 같아야하고
2. 매개변수의 개수 또는 타입이 달라야 한다.

 

가변 인자 (variable argument)
매개변수의 개수를 동적으로 지정(여러개의 매개변수를 받을 수 있다~ )

public void test(String... param) {
	System.out.println("param: " + param);
    
}

 

 

[가변인자 사용법]

타입… 변수명

void sum(String...str) {
        for(String a : str)
            System.out.println(a);
}

Public static void main(String args[]) {
    Varargs v = new Varargs();
    v.sum("a","b","c");
    v.sum();
    v.sum(new String [2]);
}

가변인자는 내부적으로 배열을 생성해서 사용한다 (향상된 for문 str, 인자값으로 배열 넣어짐)

 

 

 

가변인자는 매개변수 중에서 제일 마지막에 선언해야 한다.
왜? 처음에 가변인자를 두게 되면 어디까지가 가변인자의 인수로 선언되었는지 컴파일러는 확인을 할 수 없기 때문

public class pp {
    public static void main(String[] args) {
        int sum = add(1,2,3,4,5);
        System.out.println(sum); 
			// 15

        sum = addString("lemon", 7,8,9);
		System.out.println(sum);
			// lemon
			// 24

    }

    static int add(int...nums) {
        int answer = 0;
        for(int num : nums){
          answer += num;
        }
        return answer;
    }

    static int addString(String s, int...num){
        int answer = 0;
        System.out.println(s);

        for(int i =0; i<num.length; i++){
            answer = answer + num[i];
        }
        return answer;
    }
}

가변인자를 사용한 메소드는 오버로딩을하지 않는 것이 좋다.

 

 

Integer[] array = { 1, 2, 3, 4, 5 };
Stream.of(array)                            // return Stream<Integer>
    .forEach(System.out::println);      // prints 1, 2, 3, …

Integer[] array = { 1, 2, 3, 4, 5 };
Arrays.stream(array)                        // return Stream<Integer>
    .forEach(System.out::println);      // prints 1, 2, 3, …

Stream.of() 와 Arrays.stream() 둘 다 Integer 배열을 리턴한다.

String[] arr = { "Geeks", "for", "Geeks" };
Stream<String> stream = Arrays.stream(arr);   // 변환한 arr를 stream에 넣는다 
stream.forEach(str -> System.out.print(str + " "));  
// Geeks for Geeks

Stream stream = Stream.of("Geeks", "for", "Geeks"); 
stream.forEach(str -> System.out.print(str + " "));  // Geeks for Geeks

 

 

차이점

 

 

1. Primitives arrays; 기본형 배열일 때 (예: int[], long[] etc)

예를 들어 int 배열을 전달 시

int[] array = { 1, 2, 3, 4, 5 };
Arrays.stream(array)                    // returns IntStream
    .forEach(System.out::println);      // prints 1, 2, 3, …

int[] array = { 1, 2, 3, 4, 5 };
Stream.of(array)                        // returns `Stream<int[]>`
    .forEach(System.out::println);      // prints [I@27d6c5e0

 

 

 

Stream.of()는 Integer 배열 ’Stream<int[]>’을 반환

정수 배열로 리턴 받기 위해서는 Stream<int[]>
 → IntStream 으로 명시적 변환해야한다.

public static void main(String[] args) {

	int[] array = { 1, 2, 3, 4, 5 };

	Stream.of(array)                        // returns `Stream<int[]>`
	    .flatMapToInt(Arrays::stream)       // returns IntStream
	    .forEach(System.out::println);      
	
// 1 2 3 4 5

 

 

 

Arrays.stream()는 IntStream으로 바로 반환된다.

public static void main(String[] args) {

	int[] array = { 1, 2, 3, 4, 5 };

	IntStream intStream = Arrays.stream(array);         // returns `IntStream`
	intStream.forEach(str -> System.out.print(str + " "));  

// 1 2 3 4 5

 

 

 

2. int[], double[], long[] 이외의 기본 유형인 경우

 

Stream.of()는 T(Stream)형식의 일반 Stream을 반환

public static void main(String[] args) {

	char[] arr = { '1', '2', '3', '4', '5' };
	Stream<char[]> stream = Stream.of(arr);
	stream.forEach(str -> System.out.print(str + " "));
	}
}

// [C@548c4f57

 

 

 

Arrays.stream()은 컴파일 오류가 난다.

char[] arr = {'1', '2', '3', '4', '5'};
Arrays.stream(arr);

//Compilation Error in java code :- prog.java:20: error: no suitable method found for stream(char[]) Arrays.stream(arr);

 

 

728x90