[Java] Stream.of() vs Arrays.stream()
배열의 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);