Language/Java

Stream

Anoi 2023. 6. 2. 19:09
  • 배열이나 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자
  • 배열이나 컬렉션(List, Set, Map)으로 원하는 값을 얻을 때 for문 도배를 방지하기 위해 나온 개념
     → 내부 반복자 사용

0부터 10까지 출력하는 코드를 for문과 Stream으로 비교해보자

 

1) for문 : 3줄

1
2
3
4
5
6
7
8
9
10
11
12
13
import java.util.stream.IntStream;
 
public class Stream {
 
    public static void main(String[] args) {
    
        
        for(int i=0; i<=10; i++) {
            System.out.print(i);
        }
    }
}
 
cs

 

2) Stream

1
2
3
4
5
6
7
8
9
10
import java.util.stream.IntStream;
 
public class Stream {
 
    public static void main(String[] args) {
        
        IntStream.rangeClosed(010).forEach(System.out::print);
    }
}
 
cs

 

for문에서 3줄이 걸리는 코드가 stream에서는 1줄로 표현 가능하다.


Stream 선언하기

배열, 컬렉션(list, set, map) 등을 스트림 형태로 만들기

  • Stream<데이터타입> stream명 = Arrays.stream(배열명);
  • Stream<데이터타입> stream명 = 리스트명.stream();
  • Stream<데이터타입> stream명 = Stream.of('값', '값'....);

 

Stream 메소드

1. boxed() :  int, long, double 요소를 Integer, Long, Double 요소로 박싱해서 스트림을 생성한다.

 

2. filter() : 스트림 요소를 순회하면서 특정 조건을 만족하는 요소로 구성된 새로운 스트림을 반환한다.

 

3. map() : 요소들을 특정 조건에 해당하는 값으로 변환한다.

 

3. count() : 최종 처리기능으로 마지막에 남은 원소들을 카운팅한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.util.Arrays;
import java.util.List;
import java.util.stream.IntStream;
 
public class Stream {
 
    public static void main(String[] args) {
        
        List<String> fruit = Arrays.asList("apple""banana""peach""orange");
        int count = (int) fruit.stream().filter(n->n.contains("e")).count();
        System.out.println("count :" + count);
 
    }
}
cs

 

String타입의 fruit이라는 리스트를 만들어서 4종류의 과일을 넣었다.

 

여기서 이름에 e가 포함된 과일의 개수를 구해보자.

fruit.stream()으로 리스트를 스트림에 복사하고(원본 리스트는 영향 받지 않음)

.filter()로 이름에 e가 들어있는지 알아보는 조건을 추가함

그리고 .count()로 개수를 뽑아낸다.