- 오늘의 키워드
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를 처음알게 되었고 이러한 것을 몰랐을 때에는 배열이나 리스트에 관한 조건들을 일일이 코드를 더 길게 쓰게 되었는데 잘 익히고 활용만 할 수 있다면 코드를 좀더 최적화를하여 보기와 이해하기 쉽게 만들 수 있을 것 같다.
강의 내용들이 너무 많아 한번에 익힐 수 가 없지만 다시금 복습하여 하나하나 되새겨야 할 것 같다.
'내일배움캠프' 카테고리의 다른 글
내일배움캠프 TIL - Spring MVC 이모저모 (0) | 2024.01.18 |
---|---|
내일배움캠프 TIL - Gradle에 관해서 (0) | 2024.01.17 |
내일배움캠프 11일차 TIL - 제너릭에 대하여 (1) | 2024.01.08 |
내일배움 캠프 10일차 TIL - 개인과제 (자바 키오스크 구현) 진행중 (1) | 2024.01.05 |
내일배움캠프 9일차 TIL - Java 상속에 대해 알아보자 (1) | 2024.01.04 |