반응형
스트림(Stream) 이란?
자료의 대상과 관계없이 배열, 컬렉션을 대상으로 동일한 연산을 수행
특징
- 한번 생성하고 사용한 스트림은 소모되기 때문에 재사용을 할 수 없음 → 다른 연산을 수행하기 위해서는 스트림을 재생성해야 함.
- 스트림 연산은 기존 자료를 변경하지 않음
- 스트림 연산은 중간 연산과 최종 연산으로 구분 (중간 연산은 여러 개의 연산이 적용될 수 있지만, 최종 연산은 마지막에 한 번만 적용)
최종 연산이 호출되어야 중간 연산에 대한 수행이 이루어지고 그 결과가 만들어짐
따라서 중간 연산에 대한 결과를 연산 중에 알 수 없는데 이를 '지연 연산'이라고 함.
스트림 생성과 사용
정수 배열에 연산을 수행하는 예
기존 방식
public class IntArrayTest {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
for(int num : arr) {
System.out.println(num);
}
}
}
스트림 생성
public class IntArrayStreamTest {
public static void main(String[] args) {
int[] arr = {1,2,3,4,5};
IntStream is = Arrays.stream(arr);
is.forEach(n->System.out.println(n));
int sum = Arrays.stream(arr).sum();
System.out.println(sum);
}
}
- 모든 array들은 arrays 클래스를 활용 가능
- forEach는 element를 하나씩 꺼내라
- 처음 시행이 된 is는 소멸하게 되고 int sum을 재생성
중간 연산과 최종 연산
1. 중간 연산
- 중간 연산의 예 - filter( ), map( ), sorted( ) 등 < 많은 연산이 존재>
- 최종 연산이 호출될 때 중간 연산이 수행되고 결과가 생성
filter( ) 조건에 맞는 요소를 추출
map( ) 요소를 변환
2. 최종 연산
- 중간 연산과 최종 연산에 대한 구현은 람다식을 활용
- 스트림이 관리하는 자료를 하나씩 소모해가며 연산이 수행
- 최종 연산 후에 스트림은 더 이상 다른 연산을 적용할 수 없음
- 최종 연산의 예 - forEach( ), count( ), sum( ) 등 < 많은 연산이 존재>
forEach( ) : 요소를 하나씩 꺼내 옴
count ( ) : 요소의 개수
sum ( ) : 요소들의 합
3. 중간 연산과 최종 연산의 시용
문자열의 길이가 5 이상인 요소만 출력
sList.stream().filter(s->s.length() >= 5).forEach(s->System.out.println(s));
- 중간 연산 filter( ) , 최종 연산 forEach( )
고객 클래스 배열에서 고객 이름만 가져오기
customerList.stream( ).map(c->c.getName( )).forEach(s->System.out.println(s));
- 중간 연산 map( ), 최종 연산 forEach( )
ArrayLsit 객체에 스트림 생성과 사용
ArrayList에 문자열 자료(이름)를 넣고 이에 대한 여러 연산을 수행
public class ArrayListStreamTest {
public static void main(String[] args) {
List<String> sList = new ArrayList<String>();
sList.add("Tomas");
sList.add("Edward");
sList.add("Jack");
Stream<String> stream = sList.stream();
stream.forEach(s->System.out.print(s + " "));
System.out.println();
sList.stream().sorted().forEach(s->System.out.print(s+ " "));
sList.stream().map(s->s.length()).forEach(n->System.out.println(n));
sList.stream().filter(s->s.length() >= 5).forEach(s->System.out.println(s));
}
}
- Collection에 대한 Stream을 사용할 때는 Generic type으로 가지고 있는 것을 명시
Stream<String> stream = sList.stream( );
- 새로운 연산을 수행하기 위해 stream()메서드를 호출하여 스트림을 재생성
반응형
'개발 > Java' 카테고리의 다른 글
Java의 예외 처리하기 - Exception (0) | 2021.05.07 |
---|---|
reduce( ) 연산 (0) | 2021.05.07 |
람다식(Lambda expression) (0) | 2021.05.05 |
내부 클래스(inner class) (0) | 2021.05.04 |
Map 인터페이스 <HashMap> <TreeMap> (0) | 2021.05.04 |