스트림(Stream)이란?
자바 8에서 추가한 스트림(Streams)은 람다를 활용할 수 있는 기술 중 하나이다.
자바8 이전 방식이라면 for문에서 if조건으로 필터링하고 요소를 하나씩 꺼내어 다루는 방법이였다.
간단한 경우라면 상관없지만 로직이 복잡해질수록 코드의 양이 많아져 여러 로직이 섞이게 되고, 메소드를 나눌 경우 루프를 여러 번 도는 경우가 발생한다.
스트림은 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링된 결과를 얻을 수 있다.
스트림의 특징
원본의 데이터를 변경하지 않는다.
Stream API는 원본의 데이터를 조회하여 원본의 데이터가 아닌 별도의 요소들로 Stream을 생성한다. 그렇기 때문에 원본의 데이터로부터 읽기만 할 뿐이며, 정렬이나 필터링 등의 작업은 별도의 Stream 요소들에서 처리가 된다.
Stream은 일회용이다.
Stream API는 일회용이기 때문에 한번 사용이 끝나면 재사용이 불가능하다. Stream이 또 필요한 경우에는 Stream을 다시 생성해주어야 한다. 만약 닫힌 Stream을 다시 사용한다면 IllegalStateException이 발생하게 된다.
람다식으로 요소 처리 코드를 제공
Stream이 제공하는 요소 처리 메소드는 함수적 인터페이스 매개 타입(Functional Interface) 를 가지기 때문에 람다식 또는 메소드 참조 를 이용해서 요소 처리 내용을 매개값 으로 전달할 수 있다.
public class LamdaExpressionExample {
public static void main(String[] args) {
List<String> list = Arrays.asList("list1, list2, list3");
Stream<String> stream = list.stream();
stream.forEach(s -> {
System.out.println(s);
});
}
}
내부작업자를 사용하므로 병렬처리(multi-threading)가 가능하다
· 내부 반복자(internal iterator): 컬렉션 내부에서 요소들을 반복시키고, 개발자는 요소당 처리해야할 코드만 제공하는 코드 패턴
· 외부 반복자(external iterator): 개발자가 코드로 직접 컬렉션의 요소를 반복해서 가져오는 코드 패턴
내부 반복자의 장점
- 어떻게 요소를 반복시킬 것인가는 컬렉션에 맡겨두고, 개발자는 요소 처리 코드에만 집중할 수 있다.
- 내부 반복자는 요소들의 반복 순서를 변경하거나, 멀티 코어 CPU를 최대한 활용하기 위해 요소들을 분배시켜 병렬 작업을 할 수 있게 도와줌
- 순차적 외부 반복자보다 효율적으로 요소를 반복시킬 수 있음
참고
https://cornswrold.tistory.com/293
https://futurecreator.github.io/2018/08/26/java-8-streams/
https://scshim.tistory.com/364?category=1022880
'언어 > JAVA' 카테고리의 다른 글
OOP의 4대 특성 및 5대 원칙 (0) | 2022.01.14 |
---|---|
람다식(Lambda Expression) (0) | 2021.12.17 |
Serialize(직렬화) (0) | 2021.12.14 |
Java 입출력 (InputStream/OutputStream) (0) | 2021.12.11 |
Hash (0) | 2021.12.07 |