본문 바로가기

언어/JAVA

Stream

스트림(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