안녕하세요!
지금까지 다량의 데이터를 한번에 관리할 수 있게 해주는 Collections에 대해서 쭉 알아보았는데요,
이번에는 Collections 타입의 자료들과 배열을 더욱 손쉽게 가공할 수 있도록 해주는 Stream에 대해 알아보도록 하겠습니다.
Stream은
1. 대용량 데이터의 복잡한 가공처리를 할 때
2. 컬렉션 데이터의 복잡한 가공처리를 할 때 (대용량이 아니어도!)
3. multi threading이 아닌 진짜 병렬처리
를 할 때 유용하게 사용된다고 합니다.
먼저 알아두어야 할 사항은 Stream은 declarative programming(선언형 프로그래밍) 형태로, 지금까지 사용해오던 imperative programming(명령형 프로그래밍)과는 사뭇 다른 코드 형태를 보인다는 것입니다. 처음에는 좀 당황스러운데 익숙해지면 상당히 친절한 도구라는 것을 알 수 있게됩니다.
선언형 프로그래밍은 무엇을 할 것인지에 초점을 둔 코딩 방식이고 명령형 프로그래밍은 어떻게 할 것인지에 초점을 두는 방식입니다. 최근의 추세가 좀 더 직관적인 선언형으로 바뀌는 추세이다 보니 Java에도 도입된 것 같습니다.
(관련해서 맨아래 출처에 좋은 블로그 링크를 남겨 둘테니 들어가 보시면 자세한 설명을 보실 수 있습니다.)
이제 한번 Stream을 사용하는 방법에 대해서 순차적으로 이야기해보도록 하겠습니다.
전반적인 과정은
1) Stream 생성해주기
2) 데이터 sorting, mapping 또는 filtering(원하는 데이터만 뽑기)등의 중간 연산(intermediate operation)
3) 데이터 카운트, 평균, 합, 최대, 최소값 구하기 등의 최종 연산(terminal operation)
이렇게 세 단계로 이루어지게 됩니다. 이 때, 중간연산은 필요에 따라 여러번 수행할 수도 있습니다.
1. Stream 생성하기
배열과 Collection 안에 들어 있는 데이터들을 가공하려면 사전 작업이 필요한데요, 바로 Stream을 생성하는 작업입니다.
배열인지 Collection type인지에 따라 Stream을 생성하는 방법이 조금 다릅니다.
1) 배열인 경우
- String[] 일 때
String[] myStrArr = {"A", "G", "A", "H", "V", "U"}; //String type 요소들을 담은 배열
//Arrays.stream() 사용하기
Stream<String> stringStream = Arrays.stream(myStrArr);
//String을 요소로 갖는 Stream을 변수를 생성하고 Arrays.stream()을 이용해 Stream 생성하기
//Stream.of() 사용하기
Stream<String> stringStream1 = Stream.of(myStrArr);
먼저 String을 요소로 갖는 Stream 타입의 변수를 선언하고(stringStream),
Arrays.stream() method를 사용하여 값을 할당해주었습니다. *API를 살펴보면 stream method는 Stream<T>이 return type입니다. 그렇기 때문에 변수도 Stream<T> type의 변수를 선언해준 것입니다.
따로 String[] 변수 선언 없이 바로 Stream을 생성할 수도 있습니다.
//Stream.of() 사용
Stream<String> stringStream1 = Stream.of("A", "B", "C");
Stream<String> stringStream2 = Stream.of(new String[] {"A","B","C"});
//Arrays.stream() 사용
Stream<String> stringStream3 = Arrays.stream(new String[] {"A","B","C"});
Stream<String> stringStream4 = Arrays.stream(new String[] {"A", "B", "C", "D"},0,4);
//0은 시작 인덱스, 4는 마지막 인덱스(미포함)를 지정해 준 것입니다. 그러므로 Stream에는 "A", "B", "C" 만 들어가게 됩니다.
이렇게 다양하게 생성하는 방법이 있습니다.
- int[], double[], long[] 배열 일 때 -> IntStream, DoubleStream, LongStream 사용!
Primitive type(원시형)의 경우는 모든 타입에 대해 다 제공하지는 않고 int, double, long만 제공하는 것 같습니다.
//int[]
int[] intArr = {1, 2, 3, 4, 5, 6};
IntStream intStream = Arrays.stream(intArr);
//double[]
double[] doubleArr = {0.3, 0.4, 0.6, 1.5, 9.77};
DoubleStream doubleStream = Arrays.stream(doubleArr);
//long[]
long[] longArr = {1220128347018324103L,3220128347018324103L};
LongStream longStream = Arrays.stream(longArr);
//IntStream과 LongStream은 숫자 범위를 지정해서 stream을 만들수도 있습니다.
IntStream intStream1 = IntStream.range(4, 100);
LongStream longStream1 = LongStream.range(3849283L,123132123123L);
하지만 나머지 primitive type도 아래처럼 stream을 생성할 수는 있습니다.
//float
Float[] floats = {1.12f, 8.34f};
Stream<Float> floatStream = Arrays.stream(floats);
//boolean
Boolean[] booleans = {true, false, true, false, true};
Stream<Boolean> booleanStream = Arrays.stream(booleans);
//int도 wrapper class Integer를 사용하면 아래처럼 stream형성 가능
Integer[] integers = {1, 2, 3};
Stream<Integer> integerStream = Arrays.stream(integers);
2) Collection type일 때
Collection인 경우에는 collection type 변수명.stream()을 사용하면 됩니다.
//Arrays.asList 사용
List<String> list = Arrays.asList("A", "B", "C");
Stream<String> listStream = list.stream();
//Collection type 변수 사용
ArrayList<String> stringArrayList = new ArrayList<>(){{
add("H");
add("H");
add("F");
add("P");
}};
Stream<String> arrListStream = stringArrayList.stream();
*궁금증: Arrays.asList() 는 ArrayList를 return 한다고 하는데,,, 혹시 정확히 아시는 분 계시면 알려주세요!
Stream이 무엇인지, 어떻게 stream을 생성하는지 배열이냐 collection이냐에 따라 나눠서 알아보았습니다.
글이 너무 길어져서 중간 연산(intermediate opration)과 최종 연산(terminal operation)은 별도의 포스팅으로 작성하도록 하겠습니다.
감사합니다. ☺️
참고자료
https://boxfoxs.tistory.com/430
https://www.geeksforgeeks.org/arrays-stream-method-in-java/
https://docs.oracle.com/javase/8/docs/api/
<Oracle-Stream class>
'Java' 카테고리의 다른 글
Stream 사용하기(3) - 최종 연산의 종류와 방법 (0) | 2022.05.21 |
---|---|
Stream 사용하기(2) - 중간 연산의 종류와 방법 (2) | 2022.05.20 |
Generics(제네릭)의 의미와 사용법 (0) | 2022.05.18 |
Final 키워드 알아보기 (0) | 2022.05.16 |
Static 키워드 알아보기 (0) | 2022.05.12 |