본문 바로가기

Java

JAVA8) 스트림 API

1. 스트림

 

자바에서는 많은 양의 데이터를 저장하기 위해 배열, 컬렉션을 이용한다.

배열, 컬렉션의 데이터에 접근하기 위해서는 기존의 방법으로는 for문이나 iterator을 사용하여 접근했는데.,

JAVA8버전 부터 도입된 람다식과 람다식을 이용하는 스트림은 효율적으로 요소들에 접근하는 방식을 제공한다.

 

 

2. 스트림의 특징

  • 스트림은 내부반복을 통해 작업을 수행한다.
  • 생성된 스트림은 한번만 사용이 가능하다.(재사용할 수 없다)
  • 원본 데이터를 읽기만 할 뿐, 변경하지 않는다.
  • Lazy한 연산(지연 연산)을 통해 성능을 최적화한다.
  • parallelStream()을 통해 병렬연산을 지원한다.
  • 생성연산, 중개연산, 최종연산의 세가지 단계로 이루어진다.

 

3. 컬렉션 vs 스트림

 

컬렉션에 정의된 메소드 add, remove, contain들은 반복문을 순회하며 요소 하나하나에 접근하여 요소를 추가하거나 빼거나 하는 처리하는 방식이다.

반면에 스트림은 자료를 더하고 뺴는 것과 다르게 이름과 같이 연속된 자료들을 다루고 연산하고 조건에 맞게 걸러내는 역할을 주로 한다.

또한 스트림은 내부반복으로 작업을 하기 때문에 코드에 어떤식으로 처리하는지도 드러나지 않는다.

 

 

 

4. 중간연산, 최종연산

 

스트림의 코드는 메서드 체이닝방식을 쓴다.

함수형 프로그래밍은 함수가 반환값이 될 수 있고, 다른 함수의 인자로 갈 수 있다고 했다.

온점을 이용한 메서드 체이닝으로 앞의 메소드가 스트림을 반환하고 뒤의 메소드가 그 스트림을 받아 또 처리한 후 스트림을 반환하고 그런 방식이다.

스트림은 최종연산이 없다면 중간연산도 실행되지 않는다.

 

 

 

5. Lazy 지연 연산

List<String> list = Arrays.asList("a", "b", "c");

boolean b = list.stream().allMatch(str -> {
   System.out.println(str);
   return str.equals("d");
});

a,b,c의 요소가 모두 true인지 Predicate인터페이스로 확인한다.

하지만 출력은 a만 되는데, a에서 false를 반환하기 때문에 뒤에것은 보지도 않는 것이다.

 

이것이 지연 연산에 의한 최적화라고 할 수 있다.

 

 

 

 

6. 스트림의 생성

  • 컬렉션 :  stream() 
List<String> aa = Arrays.asList("hi", "my", "name");

Stream<String> stream = aa.stream();
  • 배열 : Arrays.stream(arr)
  • 가변 매개변수 : Stream.of()
  • 지정된 범위의 연속된 정수 :  IntStream.range()

 

7. 스트림의 중계연산

  • 필터링 : filter(), distinct()
  • 변환 : map(), flatMap()
  • 제한 : limit(), skip()
  • 정렬 : sorted()
  • 연산 결과 확인 : peek()

 

8. 스트림의 최종연산

  • 출력 : forEach() 반환값이 void이므로 주로 출력에 사용된다.
  • 소모 : reduce()
  • 검색 : findFirst(), findAny()
  • 검사 : anyMatch(), allMatch(), noneMatch()
  • 통계 : count(), min(), max()
  • 연산 : sum(), average()
  • 수집 : collect()

 

www.tcpschool.com/java/java_stream_terminal

futurecreator.github.io/2018/08/26/java-8-streams/

'Java' 카테고리의 다른 글

함수형 인터페이스 정리  (0) 2020.12.18
인터페이스 vs 추상 클래스  (0) 2020.12.18
JAVA8) 메소드 레퍼런스  (0) 2020.12.11
JAVA8) 람다 표현식  (0) 2020.12.11
JAVA8) 함수형 인터페이스  (0) 2020.12.11