[ Java ] Stream + Set + flatMap
자바 Stream에서 Map, Object내부에 또 다른 Map, Set, List와 같은 Collection이 있을 때 각 value를 개별된 값으로 처리하고 싶은 경우
Student POJO
public class Student {
private String name;
private Set<String> book;
public void addBook(String book) {
if (this.book == null) {
this.book = new HashSet<>();
}
this.book.add(book);
}
//getters and setters
}
flatMap() and Set example
1차적으로 map으로 POJO에 Set에 담긴 Book데이터를 가져와 flatmap으로 펼친 후 list로 collect
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
public class TestExample2 {
public static void main(String[] args) {
LexiconMain.Student obj1 = new LexiconMain.Student();
obj1.setName("mkyong");
obj1.addBook("Java 8 in Action");
obj1.addBook("Spring Boot in Action");
obj1.addBook("Effective Java (2nd Edition)");
LexiconMain.Student obj2 = new LexiconMain.Student();
obj2.setName("zilap");
obj2.addBook("Learning Python, 5th Edition");
obj2.addBook("Effective Java (2nd Edition)");
List<LexiconMain.Student> list = new ArrayList<>();
list.add(obj1);
list.add(obj2);
List<String> collect =
list.stream()
.map(x -> x.getBook()) //Stream<Set<String>>
.flatMap(x -> x.stream()) //Stream<String>
.distinct()
.collect(Collectors.toList());
collect.forEach(x -> System.out.println(x));
}
}
Output
Spring Boot in Action Effective Java (2nd Edition) Java 8 in Action Learning Python, 5th Edition
Stream관련 자세한 예제가 더 궁금하다면 아래 링크로