[Java] 모던 자바 : Stream

정재현·2024년 1월 18일

Java

목록 보기
41/43
post-thumbnail

스트림이란?

자료구조의 흐름을 객체로 제공
→ 이때 사용 가능한 메서드들을 API로 제공

스트림 특징

  1. 원본의 데이터를 변경하지 않음
    → 자바 컬렉션으로부터 스트림(해당 컬렉션의 흐름)을 받아서 한 번 사용
  2. 일회용
    → 한 번 사용한 스트림은 어디에도 남지 않음
// java.collection 내부의 stream() 메서드
// 스트림 반환
// 모든 컬렉션을 상속하는 구현체들은 스트림을 반환 가능
default Stream<E> stream() {
	return StreamSupport.stream(spliterator(), false);
}

스트림 사용 방법

  1. 스트림을 받아오기 (.stream())
carsWantToPark.stream()
  1. 스트림 가공하기
    → 가장 대표적인 API인 map(), forEach(), filter() 정도는 익혀두기
  • filter() : 조건에 맞는 것만 반환
.filter((Car car) -> { 
	car.getCompany().equals("Benz")
})
  • map() : 모든 요소를 가공해서 반환
carNames.stream()
	.map(name -> name.toUpperCase()).toList();

// 결과
// ["SERIES 6", "A9", "IONIC 6"]
  • forEach() : 내부에서 무언가 수행
List<String> carNames = Arrays.asList("Series 6", "A9", "Ionic 6");

carNames.stream()
    .forEach(System.out::println);

// 결과 
// Series 6
// A9
// Ionic 6
  1. 스트림 결과 만들기
.toList();

스트림을 사용하여 코드를 구성한 예시

  • 굉장히 길게 작성해야 하는 코드를 간결하게 작성하게 해줌
    • .stream()으로 흐름을 만들고,
    • .filter()로 반환할 조건 설정
    • .toList()로 스트림 결과 생성
List<Car> benzParkingLot =
	// carsWantToPark의 스트림값을 받아와서
    carsWantToPark.stream()
    
	// 거기 구현되어 있는 filter()메서드를 사용합니다.
	// filter메서드는 함수를 파라미터로 전달받습니다.
	// 여기서 함수는 제조사가 벤츠면 true를 반환하는 함수네요.
	// 필터 메서드는 이름처럼 false를 반환한 스트림의 원소들을 제거합니다.
    .filter((Car car) -> car.getCompany().equals("Benz"))
    
	// 이 결과도 반환을 받아서 다시 리스트로 묶어줍니다.
    .toList();
  1. 스트림 객체를 받습니다.
  2. 해당 객체는 자료구조의 모든 원소가 있습니다.
  3. filter()와 같은 이미 구현된 메소드도 있습니다.
  4. filter() 메소드는 true/false 값을 return하는 함수를 파라미터로 전달받습니다.
  5. filter() 메소드는 스트림에 들어있는 모든 원소에 파라미터로 전달받은 함수를 실행시켜보면서 (우리의 코드 같은 경우 모든 원소가 익명함수의 Car car 파라미터로 자동으로 전달됩니다.)
  6. false가 나온 원소를 제거한 스트림을 반환해줍니다.
  7. 해당 결과를 다시 컬렉션으로 묶어주는 메서드도 정의되어있습니다.
  • 사실 간단하게는 다음과 같은 일을 하고 있는 것
ArrayList<Car> benzParkingLotWithoutStream = new ArrayList<>();

for (Car car : carsWantToPark) {
    if (car.getCompany().equals("Benz")) {
        benzParkingLotWithoutStream.add(car);
    }
}
profile
공부 기록 보관소

0개의 댓글