개발자 준비과정/JAVA

[JAVA] 스트림 기초

하늘바람a 2024. 3. 21. 14:23

스트림(stream)

자바 8부터 추가된 기능으로, 컬렉션 및 배열에 저장된 요소반복처리하기 위한 인터페이스이다.

API의 stream 정의

 

이전까지는 컬렉션이나 배열에 데이터를 담고 원하는 결과를 얻기 위해 for문과 Iterator(반복자)를 이용해서 코드를 작성했다. 각각의 원소에 접근해 원소를 가공해야했기 때문에 코드가 길고 알아보기 어려웠다. 또한 각 컬렉션 클래스마다 같은 기능의 메서드들이 중복하여 정의되어 있어 데이터 소스마다 다른 방식으로 다루어야했다. 예를들면

List를 정렬할 때는 Collections.sort() 

배열을 정렬할 때는 Arrays.sort() 을 사용해야 한다.

 

스트림(stream)은 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드들을 정의해놓았다.

이는 데이터 소스가 무엇이던 같은 방식으로 다룰 수 있고, 코드의 재사용성이 높아진다는 뜻이다.

 


 

다음은 향상된for문, Iterator와 스트림을 이용하여 List에서 홀수 값만 모두 더하여 출력하는 코드이다.

// List 생성
List<Integer> list = List.of(10, 9, 5, 20, 4, 6, 7, 55, 33, 11, 55, 66);
int sum1 = 0;
int sum2 = 0;
int sum3 = 0;

// 향상된 for문을 이용한 코드
for (Integer item : list) {          // 리스트의 각 요소를 하나씩 반복하여 가져옴
    if (item % 2 == 1) {             // 가져온 요소가 홀수인지 검사
        sum1 += item;                // 홀수인 경우에만 합계 변수에 더함
    }
}
System.out.println("sum1 = " + sum1);


//Iterator를 이용한 코드
Iterator<Integer> iterator = list.iterator();    // Iterator 객체 생성하여 리스트의 요소를 탐색
while (iterator.hasNext()) {                     // 다음 요소가 있는지 확인
    Integer item = iterator.next();              // 다음 요소를 가져옴
    if (item % 2 == 1) {                         // 가져온 요소가 홀수인지 검사
        sum2 += item;                            // 홀수인 경우에만 합계변수에 더함
    }
}
System.out.println("sum2 = " + sum2);


// 스트림을 이용한 코드
int sum3 = list.stream()               // 리스트로부터 스트림 생성
        .filter(a -> a % 2 == 1)       // 람다식을 사용하여 홀수만 필터링
        .mapToInt(Integer::intValue)   // Integer를 int로 매핑
        .sum();                        // 필터링 및 매핑된 요소들의 합 구하기
System.out.println("sum3 = " + sum3);

 

스트림의 특징
  • 스트림은 데이터 소스를 변경하지 않는다.
  • 스트림은 일회용이다.
  • 스트림은 작업을 내부 반복으로 처리한다.
    • 반복문을 메서드의 내부에 숨길 수 있다는 것을 의미한다.

 

forEach() : 스트림 메소드 중의 하나로 매개변수에 대입된 람다식을 데이터 소스의 모든 요소에 적용

  -> 메서드 안으로 for문을 넣은 것.

for(String str : strList){
    System.out.println(str);}
→ 
(스트림으로)
stream.forEach(System.out::println);
메서드 참조를 스트림으로 표현 stream.forEach( a -> System.out.println(a));