Java의 Stream은 Java 8
부터 지원된 기능이다.
배열이나 컬렉션 인스턴스에 여러 함수들을 조합해 원하는 결과를 필터링할 수 있다. 람다를 이용하여 코드 양을 줄여 간결하게 표현할 수 있다.
또한, 병렬 처리(multi threading)가 가능하다.
💡 스트림에 대한 내용은 3가지로 나눌 수 있다.
스트림을 사용하려면 스트림 객체를 생성해야 한다. 자주 사용하는 컬렉션 객체들은 stream()
메서드를 지원한다.
컬렉션 타입(Collection
, List
, Set
)의 경우 stream()
메서드를 호출하여 스트림 객체를 만들 수 있다.
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
배열의 경우 아래와 같이 Arrays.stream()
메서드를 사용한다.
String[] array = new String[]{"a", "b", "c"};
Stream<String> stream1 = Arrays.stream(array);
Stream<String> stream2 = Arrays.stream(array, 1, 3); // index 1 포함, 3 제외
문자열에 대한 스트림을 생성할 수도 있다. 문자열을 구성하고 있는 각각의 문자들의 ASCII 코드 값을 스트림 형태로 출력해준다.
IntStream charsStream =
"Stream".chars(); // [83, 116, 114, 101, 97, 109]
⠀
특정 구분자를 이용해 문자열을 split한 다음, 각각의 요소들로 스트림을 만들 수 있다.
Stream<String> stringStream =
Pattern.compile(", ").splitAsStream("KOR, USA, JPN"); // [KOR, USA, JPN]
빌더(Builder)를 사용하면 직접적으로 원하는 값을 넣을 수 있다.
String<String> stream = Stream<String>builder()
.add("KOR")
.add("USA")
.add("JPN")
.build();
Stream.concat
메서드를 사용하여 두 개의 스트림을 연결해 새로운 스트림을 생성할 수 있다.
Stream<String> stream1 = Stream.of("Java", "Python", "C++");
Stream<String> stream2 = Stream.of("PHP", "Java Script", "C");
Stream<String> concat = Stream.concat(stream1, stream2);
// [Java, Python, C++, PHP, Java Script, C]
필터(filter)는 스트램 내의 요소들 중에 특정 데이터를 추출하는 역할을 한다.
Stream<T> filter(Predicate<? super T> predicate);
filter()
메서드에 boolean 값을 리턴하는 람다식을 넘겨주게 되고, 추출되는 데이터에 대해 람다식을 적용하여 true가 리턴되는 데이터만을 선별한다.
⠀
// List<String> fruit = Arrays.asList("apple", "banana", "cherry");
Stream<String> stream =
names.stream()
.filter(name -> name.contains("a")); // [apple, banana]
스트림의 각 요소에 대해 평가식을 실행하고, 'a'가 포함된 이름만이 들어간 스트림이 리턴된다.
맵(map)은 스트림 내의 요소들을 하나씩 특정 값으로 변환한다.
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
map()
메서드는 값을 변환해주는 람다식을 인자로 받는다.
스트림 내의 값이 input 되어 특정 로직을 거쳐 output이 되어 새로운 스트림에 담기게 된다. 이러한 작업을 Mapping이라 한다.
⠀
// List<String> fruit = Arrays.asList("apple", "banana", "cherry");
Stream<String> stream =
fruit.stream()
.map(String::toUpperCase); // [APPLE, BANANA, CHERRY]
스트림 내의 String에 toUpperCase
메서드를 실행해 대문자로 변환된 값들이 담긴 스트림을 리턴한다.
💡 이외의 더 많은 내용이 궁금하다면 아래 참고 자료 링크를 참고하자.