중첩 된 일대 다 관계에 대한 Java 8 Collector 체인

에코 수 실로

컬렉션을 반복하기 위해 Java 8 스트림 및 수집기를 사용하고 있습니다. 작업이 끝나면 스트림에 포함 된 개체를 관련 비즈니스 개체로 변환해야합니다. 그리고 이러한 비즈니스 객체는 관계 1과 다수를 갖습니다. 아래에 명확한 설명을 위해 사용되는 클래스가 있습니다.

첫 번째는 스트림에 포함 할 컬렉션을 나타내는 Helper 클래스입니다.

public class Helper{
    private String a;
    private String additionalA;
    private String additionalB;
    private String additionalC;
    //constructor, setter, getter, equals, hashCode omitted.
} 

Bean A는 관계가없는 단일 Bean이며 기본 요소입니다.

public class BeanA{
        private String a;
        private String additionalA;
        //constructor, setter, getter, equals, hashCode omitted.
}

Bean B는 추가 정보뿐만 아니라 Bean A와 일대 다 관계를 갖습니다.

public class BeanB{
        private List<BeanA> beanA = new ArrayList<BeanA>();
        private String additonalB;
       //constructor, setter, getter, equals, hashCode omitted.
}

BeanC는 BeanB 및 추가 정보와 일대 다 관계를 가지고 있습니다.

public static class BeanC {
        private List<BeanB> beanB = new ArrayList<BeanB>();
        private String additionalC;
        //constructor, setter, getter, equals, hashCode omitted.
}

또한 다음과 같은 여러 가지 변환 방법이 있습니다.

public static BeanA getBeanA(Helper helper) {
    BeanA a = new BeanA();
    a.setA(helper.getA());
    a.setAdditionalA(helper.getAdditionalA());
    return a;
}

public static BeanB getBeanB(Helper helper) {
    BeanB b = new BeanB();
    //maybe wrong to add the data to list (see below)
    b.getBeanA().add(getBeanA(helper));
    b.setAdditonalB(helper.getAdditionalB());
    return b;
}

public static BeanC getBeanC(Helper helper) {
    BeanC c = new BeanC();
    //maybe wrong to add the data to list (see below)
    c.getBeanB().add(getBeanB(helper));
    c.setAdditionalC(helper.getAdditionalC());
    return c;

}

예상되는 결과는지도입니다.

Map<BeanC,Map<BeanB,List<BeanA>>> 

원하는 결과를 생성하기 위해 다음 블록이 있습니다.

Map<BeanC, Map<BeanB, List<BeanA>>> res = helpers.stream()
                .collect(Collectors.groupingBy(
                        Test::getBeanC,
                        Collectors.groupingBy(Test::getBeanB, 
                                Collectors.collectingAndThen(Collectors.toList(), 
                                        list -> list.stream()
                                                    .map(Test::getBeanA)
                                                    .collect(Collectors.toList())))));

문제는 BeanC 및 BeanB의 목록이 올바르게 설정되지 않은 것입니다.

누구든지 수집기를 사용하여 일대 다 관계를 초기화하는 방법을 알고 있습니까?

홀거

그룹화 기능을 사용하여 컬렉션을 채울 수 없습니다. 그룹화 기능은 각 스트림 요소 (예 : Helper인스턴스) 에 대해 평가 되어 결과 동일성기반으로 그룹을 구축합니다 . 귀하의 getBeanCgetBeanB메소드는 매번 새 빈을 생성하고 하나의 중첩 된 객체로 채워지지만,이 객체 중 하나를 제외한 모든 객체는 동등성이 확인 된 후 각 그룹에 대해 삭제됩니다.

귀하의 질문이 콩의 평등이 정의하는 방법을 보여하지만, 점을 고려하지 않는 additionalCadditionalB이제까지 그들에게 전달 된 데이터 만입니다, 나는 이러한 속성은 평등을 결정한다고 가정합니다. 따라서 Helper그룹을 빈 인스턴스로 변환하기 전에 먼저 이러한 속성별로 인스턴스를 그룹화해야합니다.

Map<String, Map<String, List<Helper>>> tmp = helpers.stream()
    .collect(Collectors.groupingBy(Helper::getAdditionalC,
        Collectors.groupingBy(Helper::getAdditionalB)));

이제 그것들을 빈 인스턴스로 변환하려면 팩토리 메소드를 조정하는 것이 도움이 될 것입니다.

public static BeanB getBeanB(String bId, List<Helper> beanA) {
    BeanB b = new BeanB();
    b.getBeanA().addAll(beanA.stream().map(Test::getBeanA).collect(Collectors.toList()));
    b.setAdditonalB(bId);
    return b;
}

public static BeanC getBeanC(String cId, Map<String,List<Helper>> beanB) {
    BeanC c = new BeanC();
    c.getBeanB().addAll(beanB.entrySet().stream()
        .map(e -> getBeanB(e.getKey(), e.getValue()))
        .collect(Collectors.toList()));
    c.setAdditionalC(cId);
    return c;
}

( getBeanA)는 변경되지 않습니다.

그런 다음 결승전을 다음 Map과 같이 만들 수 있습니다.

Map<BeanC, Map<BeanB, List<BeanA>>> res = tmp.entrySet().stream()
    .map(e -> Test.getBeanC(e.getKey(), e.getValue()))
    .collect(Collectors.toMap(Function.identity(),
        c -> c.getBeanB().stream()
              .collect(Collectors.toMap(Function.identity(), BeanB::getBeanA))));

하지만 BeanC인스턴스를 통해 모든 빈에 도달 할 수 있다는 점을 고려 하면을 원하지 않을 가능성이 Map높으며 그룹화 작업의 아티팩트 일뿐입니다. 따라서 다음과 같이 간단히 수집 할 수 있습니다 List<BeanC>.

List<BeanC> list = tmp.entrySet().stream()
    .map(e -> Test.getBeanC(e.getKey(), e.getValue()))
    .collect(Collectors.toList());

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

중첩 된 일대 다 관계에 대한 고유 한 제약

분류에서Dev

Django의 중첩 된 다 대다 관계

분류에서Dev

중첩 된 getElementsByTagName에 대한 jQuery 대체

분류에서Dev

laravel 7에서 중첩 된 일대 다 관계에 팩토리 사용

분류에서Dev

일대 다 관계의 레코드 중 하나에 대한 계산 된 속성

분류에서Dev

중첩 된 객체에 대한 MongoDB 고유 인덱스

분류에서Dev

Eloquent hasMany 관계 get ()이 중첩 된 객체에 대해 작동하지 않습니다.

분류에서Dev

다 대다 관계의 중첩 된 형태에 대한 허용되지 않는 매개 변수 Rails 4

분류에서Dev

Laravel의 중첩 된 eloquent 관계에 대한 Eager Loading

분류에서Dev

SpringData Jdbc : 중첩 된 일대 다 관계 구현에서 이름이 비어 있으면 안됩니다.

분류에서Dev

개인 회계 시트에 대한 중첩 된 Ifs

분류에서Dev

중첩 된 개체 계층 내의 형식에 대한 간단한 이름을 가져올 수 없습니다.

분류에서Dev

양방향 관계로 중첩 된 엔티티 (일대 다) 유지

분류에서Dev

csv에 대한 배열은 중첩 된 배열 값을 인쇄합니다.

분류에서Dev

자체 참조 엔티티에 대한 Typeorm 중첩 관계

분류에서Dev

중첩 된 'For'루프에 대한 대체 솔루션

분류에서Dev

동일한 이름의 중첩 된 클래스에서 대체 규칙에 스타일러스 믹스 인?

분류에서Dev

Java 8을 사용하여 중첩 된 for 루프에서 더 나은 코드 대체

분류에서Dev

C에서 중첩 된 구조체 포인터에 대한 코드 생성

분류에서Dev

중첩 된 구조체의 멤버 변수에 대한 포인터

분류에서Dev

중첩 된 구조체의 멤버 변수에 대한 포인터

분류에서Dev

중첩 된 개체에서 일치하는 키 값 쌍에 대한 경로

분류에서Dev

깊은 중첩 된 개체 배열 JSON 파일에 대한 매핑

분류에서Dev

ElasticSearch의 중첩 된 객체에 대한 와일드 카드 검색

분류에서Dev

Java 8 Stream API 표현에 대한 중첩 for 루프

분류에서Dev

대체 var에 중첩 된 var 사용

분류에서Dev

다중 배열 Java의 메소드에 대한 중첩 for 루프

분류에서Dev

중첩 된 괄호에 대한 Java 정규식

분류에서Dev

중첩 된 필드에 대한 DevExpress JavaScript 개체에 액세스

Related 관련 기사

  1. 1

    중첩 된 일대 다 관계에 대한 고유 한 제약

  2. 2

    Django의 중첩 된 다 대다 관계

  3. 3

    중첩 된 getElementsByTagName에 대한 jQuery 대체

  4. 4

    laravel 7에서 중첩 된 일대 다 관계에 팩토리 사용

  5. 5

    일대 다 관계의 레코드 중 하나에 대한 계산 된 속성

  6. 6

    중첩 된 객체에 대한 MongoDB 고유 인덱스

  7. 7

    Eloquent hasMany 관계 get ()이 중첩 된 객체에 대해 작동하지 않습니다.

  8. 8

    다 대다 관계의 중첩 된 형태에 대한 허용되지 않는 매개 변수 Rails 4

  9. 9

    Laravel의 중첩 된 eloquent 관계에 대한 Eager Loading

  10. 10

    SpringData Jdbc : 중첩 된 일대 다 관계 구현에서 이름이 비어 있으면 안됩니다.

  11. 11

    개인 회계 시트에 대한 중첩 된 Ifs

  12. 12

    중첩 된 개체 계층 내의 형식에 대한 간단한 이름을 가져올 수 없습니다.

  13. 13

    양방향 관계로 중첩 된 엔티티 (일대 다) 유지

  14. 14

    csv에 대한 배열은 중첩 된 배열 값을 인쇄합니다.

  15. 15

    자체 참조 엔티티에 대한 Typeorm 중첩 관계

  16. 16

    중첩 된 'For'루프에 대한 대체 솔루션

  17. 17

    동일한 이름의 중첩 된 클래스에서 대체 규칙에 스타일러스 믹스 인?

  18. 18

    Java 8을 사용하여 중첩 된 for 루프에서 더 나은 코드 대체

  19. 19

    C에서 중첩 된 구조체 포인터에 대한 코드 생성

  20. 20

    중첩 된 구조체의 멤버 변수에 대한 포인터

  21. 21

    중첩 된 구조체의 멤버 변수에 대한 포인터

  22. 22

    중첩 된 개체에서 일치하는 키 값 쌍에 대한 경로

  23. 23

    깊은 중첩 된 개체 배열 JSON 파일에 대한 매핑

  24. 24

    ElasticSearch의 중첩 된 객체에 대한 와일드 카드 검색

  25. 25

    Java 8 Stream API 표현에 대한 중첩 for 루프

  26. 26

    대체 var에 중첩 된 var 사용

  27. 27

    다중 배열 Java의 메소드에 대한 중첩 for 루프

  28. 28

    중첩 된 괄호에 대한 Java 정규식

  29. 29

    중첩 된 필드에 대한 DevExpress JavaScript 개체에 액세스

뜨겁다태그

보관