스트림의 스트림을 스트림으로 변환
Stream<String[]> -> Stream<Stream>
flatMap은 Array 또는 Object로 감싸져 있는 모든 원소를 단일 원소 스트림으로 반환해준다.
List 안의 요소에 Collection 값을 가지는 경우 flatMap을 이용하여 간단히 Collection 값을 가져올 수 있음.
테스트를 위해 다음과 같은 객체를 생성한다.
User Class
public class User {
private String name;
private int age;
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
MobileGame Class
public class MobileGame {
private String gameName;
private ArrayList<User> userList;
public MobileGame(String gameName, ArrayList<User> userList) {
super();
this.gameName = gameName;
this.userList = userList;
}
public String getGameName() {
return gameName;
}
public void setGameName(String gameName) {
this.gameName = gameName;
}
public ArrayList<User> getUserList() {
return userList;
}
public void setUserList(ArrayList<User> userList) {
this.userList = userList;
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
flatMapMain Class - 테스트
List 객체에 MobileGame 이라는 객체를 add 한다.
MobileGame 객체는 ArrayList 객체를 가진다.
List > MobileGame > User
List에서 flatMap을 이용하여 User 객체만 추출해보자.
public class flatMapMain {
public static void main(String[] args) {
/* 1. List 선언 */
List<MobileGame> mobileGameList = new ArrayList<>();
/* 2. List에 요소 추가 */
ArrayList<User> userList1 = new ArrayList<>();
userList1.add(new User("disman", 24));
userList1.add(new User("hehe", 30));
MobileGame m1 = new MobileGame("anipang", userList1);
mobileGameList.add(m1);
ArrayList<User> userList2 = new ArrayList<>();
userList2.add(new User("cyber", 33));
MobileGame m2 = new MobileGame("portress", userList2);
mobileGameList.add(m2);
/* 3. flatMap을 이용하여 List에서 User 객체만 따로 뽑아보자. */
.flatMap(v -> v.getUserList().stream()) // Stream<MobileGame> -> Stream<User>
.collect(Collectors.toList());
System.out.println("User Name : " + u.getName() + ", User Age : " + u.getAge());
// Result
//User Name : disman, User Age : 24
//User Name : hehe, User Age : 30
//User Name : cyber, User Age : 33
});
}
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
아래는 위와 같은 내용의 비슷한 예제이다.
class PersonVO {
private String name;
private int age;
private ArrayList<String> hobbyList;
public PersonVO(String name, int age, ArrayList<String> hobbyList) {
super();
this.name = name;
this.age = age;
this.hobbyList = hobbyList;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public ArrayList<String> getHobbyList() {
return hobbyList;
}
public void setHobbyList(ArrayList<String> hobbyList) {
this.hobbyList = hobbyList;
}
}
|
List 안의 요소에 Collection 값을 가지는 경우 flatMap을 이용하여 간단히 Collection 값을 가져올 수 있음.
* List
* PersonVO
* String name
* int age
* ArrayList hobbyList
public class FlatMapInfo {
public static void main(String[] args) {
List<PersonVO> personList = new ArrayList<>();
personList.add(new PersonVO("APPR_TYPE_AGREE_PARAL", 1, new ArrayList<>(Arrays.asList("a1", "a2", "a3"))));
personList.add(new PersonVO("APPR_TYPE_APPR_INFM", 2, new ArrayList<String>() {
{
add("b1");
add("b2");
}
}));
// flatMap 미사용 : 반복문을 2번 사용하여 가져옴
List<String> hobbyListOld = new ArrayList<>();
for (PersonVO vo : personList) {
for (String list : vo.getHobbyList()) {
hobbyListOld.add(list);
}
}
/*
* flatMap 사용 : 반복문없이 사용(예제가 너무 간단하려 얼핏 비슷해 보이지만,
* 복잡한 로직에서 가져와야 하는 경우 유용할것 같다.)
*/
//.map(v -> v.getHobbyList()) // source 1
//.flatMap(v -> v.stream()) // source 2
.flatMap(v -> v.getHobbyList().stream()) // source1, 2를 사용한 것과 상동
.collect(Collectors.toList());
}
}
|
'Java' 카테고리의 다른 글
java 열거형 enum 업무활용 (0) | 2020.06.11 |
---|---|
Java Functional Interface BiPredicate 활용. (0) | 2020.06.11 |
Map에서 값을 가져올때 Optional을 이용한 Null처리 (0) | 2020.04.02 |
Interface java8에서 추가된 기능 (0) | 2020.03.27 |
이클립스 문자열 검색시 검색 문자열에 줄내림 또는 공백문자열이 포함된 경우 검색방법 (0) | 2020.03.24 |