[Java] 스트림(Stream) 사용 방법Language/Java2022. 11. 25. 10:15
Table of Contents
반응형
스트림(stream)
Java 8 버전부터 추가되었고 특정 요소 형식으로 이루어진 연속된 값에 대한 집합 인터페이스를 제공합니다.filter
, map
, reduce
, sort
, find
등의 함수들을 제공합니다.
사용 예
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {
private String name;
private String age;
}
List<Person> people = Arrays.asList(
new Person("Eden", 20),
new Person("Ko", 21),
new Person("Lee", 21),
new Person("Kang", 25)
);
Mutable
21살 이상의 사람을 찾는 코드입니다. filter
를 사용하여 20살 초과인 사람만 찾고 List에 값을 넣는 예제입니다.
List<Person> olderThan20 = new ArrayList<>();
people.stream()
.filter(person -> person.getAge() > 20)
.forEach(person -> olderThan20.add(person));
System.out.println("People older than 20: " + olderThan20);
# 결과
People older than 20: [Person(name=Ko, age=21), Person(name=Lee, age=21), Person(name=Kang, age=25)]
Collect
collect
를 사용하여 ArrayList 형식의 List를 반환합니다.
List<Person> olderThan20 = people.stream()
.filter(person -> person.getAge() > 20)
.collect(ArrayList::new, ArrayList::add, ArrayList::addAll);
System.out.println("People older than 20: " + olderThan20);
Collect To List
Collectors.toList()
를 사용하여 Collect 형식을 List로 변환합니다.
List<Person> olderThan20 = people.stream()
.filter(person -> person.getAge() > 20)
.collect(Collectors.toList());
System.out.println("People older than 20: " + olderThan20);
Group By(1)
나이를 Key로 해서 Map을 생성하는 예제입니다.
Map<Integer, List<Person>> peopleByAge = people.stream()
.collect(Collectors.groupingBy(Person::getAge));
System.out.println("Grouped by age: " + peopleByAge);
# 결과
Grouped by age: {20=[Person(name=Eden, age=20)], 21=[Person(name=Ko, age=21), Person(name=Lee, age=21)], 25=[Person(name=Kang, age=25)]}
Group By(2)
값을 Person 객체가 아닌 이름으로 구성하는 예제입니다.
Map<Integer, List<String>> nameOfPeopleByAge = people.stream()
.collect(Collectors.groupingBy(Person::getAge,
Collectors.mapping(Person::getName, Collectors.toList())));
System.out.println("People grouped by age: " + nameOfPeopleByAge);
# 결과
People grouped by age: {20=[Eden], 21=[Ko, Lee], 25=[Kang]}
reducing
이름의 첫글자가 같은 사람 중 나이가 많은 사람만 찾는 예제입니다.
// 나이 비교
Comparator<Person> byAge = Comparator.comparing(Person::getAge);
Map<Character, Optional<Person>> oldestPersonOfEachLetter = people.stream()
.collect(Collectors.groupingBy(person -> person.getName().charAt(0),
Collectors.reducing(BinaryOperator.maxBy(byAge))));
System.out.println("Oldest person of each letter: " + oldestPersonOfEachLetter);
# 결과
Oldest person of each letter: {E=Optional[Person(name=Eden, age=20)], K=Optional[Person(name=Kang, age=25)], L=Optional[Person(name=Lee, age=21)]}
예제들을 통해 스트림(Stream) 사용하는 방법을 알아봤습니다. 제공하는 함수들을 잘 사용하면 좋은 결과 값을 얻을 수 있습니다.
참고
반응형
'Language > Java' 카테고리의 다른 글
[Java 8] Stream API 면접 질문과 답변 (0) | 2024.07.30 |
---|---|
[Java] Iteration 예 (0) | 2022.11.25 |
Java 8 람다(Lambda) 적용 예 (0) | 2022.11.24 |
Java 8 스트림 적용시 성능 변화 (0) | 2022.11.24 |
[JAVA] 날짜 비교 (0) | 2022.09.23 |
@고지니어스 :: 규니의 개발 블로그
IT 기술과 개발 내용을 포스팅하는 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!