Java Stream을 이용한 Inner Join/Left Join 기능
- NoSQL Database를 사용하다보면 Join 기능이 없기 때문에 Application에서 Join 기능을 만들어야 된다.
- Java Stream을 이용하여 손쉽게 inner join/left join을 할수 있게 구현을 할수 있다.
- 저장되어 있는 DB가 서로 다른 경우에도 inner join/ left join 가능하다. ex) mysql에서 유저 정보를 가지고 와서 redis에 있는 주문 정보를 조회할수 있는 구조에서의 join 기능을 구현, batch job을 통한 데이터 추출 등..
Data Class
@Getter
@AllArgsConstructor(staticName = "create")
static class User {
private Long userId;
}
@Getter
@AllArgsConstructor(staticName = "create")
static class Order {
private Long userId;
private Long orderId;
}
List<User> userList = Lists.newArrayList(User.create(1L), User.create(2L), User.create(2L));
List<Order> orderList = Lists.newArrayList(Order.create(1L, 1L), Order.create(2L, 2L));
Inner Join
Map<Long, User> userIdMap = userList.stream()
.collect(Collectors.toMap(User::getUserId, Function.identity()));
List<Pair<Order, User,>> innerJoinList = orderList.stream()
.filter(it -> userIdMap.containsKey(it.getUserId()))
.map(it -> Pair.of(it, userIdMap.get(it.getUserId())))
.collect(Collectors.toList());
- 주문을 한 사용자 인경우
- 주문 정보와 사용자 정보를 얻을수가 있다.
Left Join
Map<Long, Order> orderIdMap = orderList.stream()
.collect(Collectors.toMap(Order::getUserId, Function.identity()));
List<User> leftJoinUser = userList.stream()
.filter(it -> !orderIdMap.containsKey(it.getUserId()))
.collect(Collectors.toList());
- 주문을 하지 않는 사용자 인경우
'Programing > Java' 카테고리의 다른 글
Spring RestTemplate (0) | 2018.07.22 |
---|---|
Spock Framework을 이용한 Unit test 작성 (0) | 2018.06.25 |
Lombok 상위클래스 필드를 이용한 객체 생성 방법 (0) | 2017.08.06 |
Lombok @Builder Default Value 사용하기 (0) | 2017.08.06 |
Lombok (0) | 2017.07.15 |