컬렉션을 반복하기 위해 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
인스턴스) 에 대해 평가 되어 결과 의 동일성 을 기반으로 그룹을 구축합니다 . 귀하의 getBeanC
및 getBeanB
메소드는 매번 새 빈을 생성하고 하나의 중첩 된 객체로 채워지지만,이 객체 중 하나를 제외한 모든 객체는 동등성이 확인 된 후 각 그룹에 대해 삭제됩니다.
귀하의 질문이 콩의 평등이 정의하는 방법을 보여하지만, 점을 고려하지 않는 additionalC
및 additionalB
이제까지 그들에게 전달 된 데이터 만입니다, 나는 이러한 속성은 평등을 결정한다고 가정합니다. 따라서 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] 삭제
몇 마디 만하겠습니다