[Java 기능] 스트림

2022. 2. 15. 00:49·Java & Kotlin
목차
  1. 스트림(Stream)
  2.  
  3.  
  4. 스트림 연산
  5. 중간 연산
  6. 최종 연산

스트림(Stream)

  • 자료의 대상과 관계없이 동일한 연산 수행 (배열, 컬렉션 대상)
  • 일관성 있는 연산으로 자료의 처리를 쉽고 간단하게 함
  • 자료 처리에 대한 추상화가 구현 되었다고 함
  • 한번 생성하고 사용한 스트림은 재사용 불가능
  • 연산 수행 시 스트림은 소모됨
  • 다른 연산을 수행하기 위해 스트림 재생성 해야함

 

IntArrayStreamTest.java
package ch05;

import java.util.Arrays;
import java.util.stream.IntStream;

public class IntArrayStreamTest {

	public static void main(String[] args) {
		
		int[] arr = {1,2,3,4,5};	
		
		IntStream is = Arrays.stream(arr);	// stream 생성
		is.forEach(n->System.out.println(n));	// element 하나씩 꺼냄, 람다식 이용

		System.out.println();
		
		int sum = Arrays.stream(arr).sum();	// stream 재생성
		System.out.println(sum);
	}

}

 

수행 결과
1
2
3
4
5

15

 

스트림 연산

  • 스트림 연산은 기존 자료를 변경하지 않음
  • 자료에 대한 스트림을 생성하면 메모리 공간은 별도로 생성되므로 연산이 수행되어도 기존 자료에 대한 변경은 발생하지 않음
  • 스트림 연산은 중간 연산과 최종 연산으로 구분됨
  • 스트림에 대해 중간 연산은 여러 개의 연산이 적용될 수 있지만 최종 연산은 마지막에 한번만 적용됨
  • 최종 연산이 호출되어야 중간 연산에 대한 수행이 이루어지고 결과가 출력됨
  • 따라서 중간 연산에 대한 결과를 연산 중에 알 수 없음
  • 이를 지연 연산(Lazy evaluation)이라고 함
  • 연산의 구현은 람다식을 활용함

 

중간 연산

  • 중간 연산 예시 - filter(), map(), sorted() 등
  • filter() : 조건에 해당하는 요소 추출
  • map() : 요소를 변환 (객체 자체에 대한 operation 수행)

 

최종 연산

  • 최종 연산 예시 - forEach(), sum(), count() 등
  • 스트림이 관리하는 자료를 하나씩 소모하면서 연산 수행
  • 최종 연산 후 스트림은 더 이상 다른 연산을 적용할 수 없음
  • forEach() : 요소를 하나씩 꺼내옴

 

ArrayListStreamTest.java
  • Primitive data type에 대한 스트림은 따로 존재함 (e.g. IntStream.. )
  • Collection에 대한 스트림을 생성할 경우 Generic 타입으로 내부적으로 가지고 있는 data의 타입을 명시해주어야 함
package ch05;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class ArrayListStreamTest {

	public static void main(String[] args) {
		
		List<String> sList = new ArrayList<>();
		sList.add("Thomas");
		sList.add("Edward");
		sList.add("Jack");
		
		Stream<String> stream = sList.stream();	// stream 생성
		stream.forEach(s->System.out.println(s));
		
		System.out.println();
		sList.stream().sorted().forEach(s->System.out.println(s));	// 정렬하여 출력
		
		System.out.println();
		sList.stream().map(s->s.length()).forEach(n->System.out.println(n));	// 각 문자열의 길이 출력
	
		System.out.println();
		sList.stream().filter(s->s.length() >= 5).forEach(n->System.out.println(n));	// 길이가 5 이상인 요소만 출력
	}

}

 

수행 결과
Thomas
Edward
Jack

Edward
Jack
Thomas

6
6
4

Thomas
Edward
저작자표시 비영리 변경금지 (새창열림)

'Java & Kotlin' 카테고리의 다른 글

[Java 기능] reduce() 연산  (0) 2022.02.15
[Java 기능] 객체지향 프로그래밍 vs 람다식  (0) 2022.02.14
[Java 기능] 함수형 프로그래밍과 람다식 문법  (0) 2022.02.14
  1. 스트림(Stream)
  2.  
  3.  
  4. 스트림 연산
  5. 중간 연산
  6. 최종 연산
'Java & Kotlin' 카테고리의 다른 글
  • [Java 기능] 스트림 활용
  • [Java 기능] reduce() 연산
  • [Java 기능] 객체지향 프로그래밍 vs 람다식
  • [Java 기능] 함수형 프로그래밍과 람다식 문법
Sue
Sue
개발 공부 로그
Sue's devlog개발 공부 로그
  • Sue
    Sue's devlog
    Sue
  • 전체
    오늘
    어제
    • 분류 전체보기 (122)
      • Algorithm (2)
      • WEB (8)
      • Java & Kotlin (83)
      • Spring (26)
      • Database (1)
      • Infra (0)
      • Git (1)
      • devlog (1)
  • 인기 글

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Sue
[Java 기능] 스트림

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.