[Java] 스트림(Stream) 사용 방법

스트림(stream)

Java 8 버전부터 추가되었고 특정 요소 형식으로 이루어진 연속된 값에 대한 집합 인터페이스를 제공합니다.
filter, map, reduce, sort, find 등의 함수들을 제공합니다.

사용 예

1
2
3
4
5
6
7
8
9
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Person {

private String name;

private String age;
}
1
2
3
4
5
6
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에 값을 넣는 예제입니다.

1
2
3
4
5
6
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);
1
2
# 결과
People older than 20: [Person(name=Ko, age=21), Person(name=Lee, age=21), Person(name=Kang, age=25)]

Collect

collect를 사용하여 ArrayList 형식의 List를 반환합니다.

1
2
3
4
5
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로 변환합니다.

1
2
3
4
5
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을 생성하는 예제입니다.

1
2
3
4
Map<Integer, List<Person>> peopleByAge = people.stream()
.collect(Collectors.groupingBy(Person::getAge));

System.out.println("Grouped by age: " + peopleByAge);
1
2
# 결과
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 객체가 아닌 이름으로 구성하는 예제입니다.

1
2
3
4
5
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);
1
2
# 결과
People grouped by age: {20=[Eden], 21=[Ko, Lee], 25=[Kang]}

reducing

이름의 첫글자가 같은 사람 중 나이가 많은 사람만 찾는 예제입니다.

1
2
3
4
5
6
7
8
// 나이 비교
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);
1
2
# 결과
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) 사용하는 방법을 알아봤습니다. 제공하는 함수들을 잘 사용하면 좋은 결과 값을 얻을 수 있습니다.

참고

Share