Programing/Java

Java Stream을 이용한 Inner Join / Left Join 기능

BUST 2018. 6. 18. 22:03

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