스트림(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) 사용하는 방법을 알아봤습니다. 제공하는 함수들을 잘 사용하면 좋은 결과 값을 얻을 수 있습니다.
참고