반응형
Stream이란
✔️Java에서의 Stream은 데이터 컬렉션을 다루는 데 사용되는 사용 합니다.
컬렉션을 for, for-each 형태보다 더 가독성 좋게 함수형 스타일로 다룰 수 있게 도와주며, 데이터를 원하는 형식으로 변환하거나 조작하는데 효율적입니다.
Filter 연산자
✔️'filter()' 연산자는 이름 그대로 컬렉션을 돌면서 주어진 조건에 따라 스트림 요소를 필터링해주는 역할입니다.
List<String> words = Arrays.asList("apple", "banana", "cherry", "date");
List<String> filteredWords = words.stream()
.filter(word -> word.startsWith("b"))
.collect(Collectors.toList());
// 결과: ["banana"]
Map 연산자
✔️'map()' 연산자는 각 요소를 특정 규칙에 따라 변환시켜 줍니다.
List<String> words = Arrays.asList("apple", "banana", "cherry");
List<Integer> wordLengths = words.stream()
.map(String::length)
// .map(str -> str.length()) 과 같습니다.
.collect(Collectors.toList());
// 결과: [5, 6, 6]
FlatMap 연산자
✔️'flatMap' 연산자는 중첩된 리스트를 펼쳐서 하나의 스트림으로 만들어줍니다.
List<List<String>> listOfLists = Arrays.asList(Arrays.asList("a", "b"), Arrays.asList("c", "d"));
List<String> flatList = listOfLists.stream()
.flatMap(List::stream)
.collect(Collectors.toList());
// 결과: ["a", "b", "c", "d"]
응용하기
스프링과 스프링부트를 통해 백엔드 개발을 하면서 사용한 로직을 보고 설명하겠습니다.
// Combination combination
String imageUrl = combination.getCombinationImages()
.stream()
.findFirst()
.map(CombinationImage::getImageUrl)
.orElse(null);
위 로직은 양방향으로 매핑된 관계에서 대표 이미지를 선택하는 코드입니다.
- stream()을 통해 컬렉션 처리를 시작합니다.
- findFirst()을 통해 첫 번째 CombinationImage를 선택합니다.
- map()을 통해 CombinationImage의 getImageUrl 함수를 통해 ImageUrl을 가져옵니다.
- orElse()로 CombinationImage가 없는 경우 null을 적용합니다.
// List<List<HashTagOption>> hashTagOptions
List<String> hashTagList = hashTagOptions.stream()
.filter(htoList -> htoList.stream()
.anyMatch(hto -> hto.getCombination().equals(combination)))
.flatMap(htoList -> htoList.stream()
.map(hto -> hto.getHashTag().getName()))
.toList();
위 로직은 양방향으로 매핑된 관계에서 작성된 해시태그 정보를 가져오는 코드입니다.
- filter()을 통해 사용할 필터를 설정합니다.
- 주어진 hashTagOptions은 2중 리스트 이므로 한 번 더 stream을 사용합니다.
- hto.getCombination(). equals(combination)을 통해 해당 combination 값과 일치하는 htoList 들을 걸러냅니다.
- flatMap()을 통해 htoList의 내부 리스트를 평면화시킵니다.
- 새로운 stream을 추가하여 각 요소에서 getHashTag(). getName() 정보를 추출합니다.
반응형
'JAVA' 카테고리의 다른 글
[JAVA] Java Stream groupingBy 통해 그룹핑하기 (0) | 2024.08.17 |
---|---|
[JAVA] JDK, JRE, JVM 차이 및 개념 이해하기 (0) | 2024.08.10 |
[JAVA] Java Optional.ofNullable() : Null 안전성과 간결한 코드 작성 방법 (0) | 2024.01.24 |
[JAVA] 자바 JUnit5 & AssertJ 테스트 코드 사용법 (0) | 2023.11.01 |
[JAVA] 자바 enum 클래스 - 열거형, 특정값 매핑 이해하기 (0) | 2023.11.01 |