JAVA/Java

Java 8 Stream

dodop 2022. 1. 14. 12:09

 

 

 

자바 8부터 지원하는 Stream은 컬렉션, 배열 등에 대해서 요소들을 하나씩 참조하여 반복적 처리를 하는 기능이다. 

스트림은 내부 반복을 통해서 작업을 처리하기 때문에 for문을 사용하는 것 보다 간결하게 식을 표현할 수 있다. 

 

 

 

 

 

Stream 

스트림의 특징은 다음과 같다. 

  1.  원래의 데이터를 읽기만 할 뿐 기존 데이터를 변경하지 않음 
  2.  일회성이므로 재사용이 불가능하다. 필요하다면 정렬된 결과를 반환하도록 한다. (스트림의 생성을 반복적으로 이용하면 연속적으로 사용할 수 있다)
  3.  스트림 생성, 중개연산, 최종연산 의 구조를 지니고 있다. ( 스트림생성().중개연산().최종연산() )
  4.  병렬 스트림은 여러 쓰레드가 작업한다. (parallelStream()으로 병렬 스트림 작성 시 parallelStream().filter(연산).count() 와 같이 사용되며 이 경우 여러 쓰레드가 스트림 요소를 필터링 하고 결과를 쓰레드 끼리 한번 더 각자 계산한 count값을 더해서 리턴한다. 쓰레드가 많거나 스트림 요소 수가 많지 않다면 오히려 쓰레드를 사용 시 드는 오버헤드가 더 발생할 수 있다.)

 

 

 

스트림 생성

스트림 API는 다양한 데이터 소스에서 생성할 수 있다. 

  • 컬렉션
  • 배열
  • 가변 매개변수 
  • 지정된 범위의 연속된 정수
  • 특정 타입의 난수
  • 람다 표현식
  • 파일
  • 빈 스트림

 

중개 연산
//filter()
List<String> fruits = Arrays.asList("apple", "banana", "peach", "grape");
Stream<String> stream = fruits.stream().filter(x -> x.contains("b"));
//banana

//distinct()
List<Integer> nums = Arrays.asList(1, 2, 2, 1);
Stream<Integer> stream =nums.stream().distinct().forEach(n -> System.out.print(n));
//1, 2


//map()
List<String> fruits = Arrays.asList(new ArrayList"apple", "banana", "peach", "grape");
fruits.stream()
     .map(x -> x.concat("s"))
     .forEach(x -> System.out.println(x));
//apples, bananas, peachs, grapes

//limit(), skip()
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
nums.skip(2).forEach(n -> System.out.print(n));
//3, 4, 5, 6, 7
nums.limit(2).forEach(n -> System.out.print(n));
//1, 2

//sort()
List<String> fruits = Arrays.asList("apple", "banana", "peach", "grape");
fruits.stream().sorted().forEach(f -> System.out.print(f));
//apple, banana, grape, peach

중개연산으로 사용되는 함수는 다음과 같다. 

  • 필터링 : filter(), distinct()
  • 변환 : map(), flatMap() ( 여기서 map은 입력한 원소를 그대로 스트림으로 반환하지만 flatMap()은 원소를 가장 작은 단위의 단일 스트림으로 반환한다 )
  • 제한 : limit(), skip()
  • 정렬 : sorted() ( sorted() 반복이 가능하여 다른 중개연산과의 사용이 가능하다 ) 
  • 결과 확인 : peek()

 

 

 

최종 연산

최종 연산은 지연되었던 모든 중개연산들이 모두 수행되는 시점이며 최종 연산 후에는 stream은 더이상 사용할 수 없다. 

  • 출력 : forEach()
  • 소모 : reduce()
  • 검색 : findFirst(), findAny()
  • 검사 : anyMatch(), allMatch(), noneMatch()
  • 통계 : count(), min(), max()
  • 연산 : sum(), average()
  • 수집 : collect()

 

 

 

 

(참고한 사이트)

https://ahndding.tistory.com/23

 

[Java] Java 8 Stream이란?

Stream이란? Java8부터 지원하는 Stream은 컬렉션, 배열등에 대해 저장되어있는 요소들을 하나씩 참조하며 반복적인 처리를 가능케하는 기능이다. 이러한 Stream을 이용한다면 불필요한 for문과 그 안

ahndding.tistory.com

https://jeong-pro.tistory.com/165

 

자바 스트림(Stream) API 정리, 스트림을 이용한 가독성 좋은 코드 만들기(feat. 자바 람다, 함수형 프

Java Stream 자바 공부를 하면서 Stream이 무엇인지, 어떻게 사용되고 있는지 인지는 하고 있었으나 실제 코드로 타이핑해보지 않았다. 그러던 중 이번에 가볍게 API 훑어보는 식으로 공부를 하면서

jeong-pro.tistory.com