본문 바로가기
내일배움캠프

내일배움캠프 12일차 TIL - Java stream 간략하게 알아보기

by Kiwimel0n 2024. 1. 9.
  • 오늘의 키워드

Stream, filter, forEach(), map()

  • 오늘 배운 내용 정리

스트림은 Java8부터 제공되는, 한번 더 추상화된 자료구조와 자주 사용하는 프로그래밍 API를 제공한 것이다.

자료구조를 한 번 더 추상화 했기 때문에, 자료구조의 종류에 상관없이 같은 방식으로 다룰 수 있다.

 

쉽게 비유 하자면, 자료구조의 "흐름"을 객체로 제공하고, 그 흐름 동안에 사용할 수 있는 메서드(행위)들을 api로 제공해주고 있다는 것이다.

쉽게 더 설명하면 자료구조(리스트, 맵, 셋 등)의 흐름이라고 비유하면 된다.

 

특징

원본의 데이터를 변경하지 않는다.

자바 컬렉션으로부터 스트림(해당 컬렉션의 흐름)을 받아서 한 번 사용한다.

일회용이다.

한 번 사용한 스트림은 어디에도 남지 않는다.

 

예시

List<Car> benzParkingLot =
// carsWantToPark의 스트림값을 받아와서
           carsWantToPark.stream()
		// 거기 구현되어 있는 filter()메서드를 사용합니다.
		// filter메서드는 함수를 파라미터로 전달받습니다.
		// 여기서 함수는 제조사가 벤츠면 true를 반환하는 함수네요.
		// 필터 메서드는 이름처럼 false를 반환한 스트림의 원소들을 제거합니다.
        .filter((Car car) -> car.getCompany().equals("Benz"))
        // 필터라는 말 처럼 회사이름이 벤츠인 것들을 걸러준다.
		// 이 결과도 반환을 받아서 다시 리스트로 묶어줍니다.
         .toList();

 

 

스트림 API

 

스트림 API는 방대해서 대표적인 것들을 소개하겠다.

filter()

  List<Book> bookList = Arrays.asList();

bookList.stream().filter(book -> book.getBookName().contains("경제"))
				//bookList의 데이터의 책이름이 경제가 포함된것들을 걸러준다.
                .forEach(f -> System.out.println("책 제목에 '경제'가 포함된 책 제목: " + f.getBookName()));

 filter의 괄호 안에 있는 조건들이 참인경우를 걸러준다.

 

 

 

forEach()

List<String> carNames = Arrays.asList("Series 6", "A9", "Ionic 6");

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

// 결과 
// Series 6
// A9
// Ionic 6

각각의 원소에 넘겨받은 함수를 실행한다.

하지만 넘겨받은 반환값을 가지고 뭘 하지는 않으며, 있다고 해도 무시된다.

 

 

map()


List<String> carNames = Arrays.asList("Series 6", "A9", "Ionic 6");

carNames.stream()
	.map(name -> name.toUpperCase()).toList();
		// 값을 받은 이름들은 대문자로 바꾸어주어 리스트를 만들어낸다.
// 결과
// ["SERIES 6", "A9", "IONIC 6"]

forEach와는 반대로 넘겨받은 토대로 값을 변환시키는데 주로 사용된다.

  • 오늘의 회고

stream이라는 api를 처음알게 되었고 이러한 것을 몰랐을 때에는 배열이나 리스트에 관한 조건들을 일일이 코드를 더 길게 쓰게 되었는데 잘 익히고 활용만 할 수 있다면 코드를 좀더 최적화를하여 보기와 이해하기 쉽게 만들 수 있을 것 같다.

강의 내용들이 너무 많아 한번에 익힐 수 가 없지만 다시금 복습하여 하나하나 되새겨야 할 것 같다.