2017-11-14 6 views
2

컨텍스트 : 나는 wsdl2java에 의해 생성 된 체인 개체가 있습니다. 비누 웹 서비스를 호출하고 xml을 수신하고 계단식 객체에서 비 정렬 화하는 메소드가 이미 작성되었습니다.두 번 사용할 수 있습니다 if 각 다른 반환 또는 분기 맵을 확인

욕망 : 다른 계층 구조 노드에있는 두 개의 서로 다른 개체를 가져오고 싶습니다. 매핑 관점에서 보면 서로 멀리 떨어져 있지만 비즈니스 관점에서는 "부부"입니다.

현재 노력하고 있습니다 :

Optional.ofNullable(onderneming.getOndernemingOfVestiging()).map(OndernemingOfVestigingType::getCode) //same return 
     .map(CodeOndernemingOfVestigingType::getValue) // different object return 
     .ifPresent(o -> myMethod("onderneming_type", o.getValue())) 
     .map(CodeOndernemingOfVestigingType::getBeschrijving) // different object return 
     .ifPresent(o -> myMethod("onderneming_type_omschrijving", o.getValue())); 

내가 하나를 가질 수 있기 때문에이 작동하지 않는 것을 이해 :

Optional.ofNullable(onderneming.getOndernemingOfVestiging()).map(OndernemingOfVestigingType::getCode) //same return 
     .map(CodeOndernemingOfVestigingType::getValue) // different object return 
     .ifPresent(o -> myMethod("onderneming_type", o.getValue())); 

Optional.ofNullable(onderneming.getOndernemingOfVestiging()).map(OndernemingOfVestigingType::getCode) //same return 
     .map(CodeOndernemingOfVestigingType::getBeschrijving) // different object return 
     .ifPresent(o -> myMethod("onderneming_type_omschrijving", o.getValue())); 

내가하려하는 것은 (의사의 설명) 같은 것입니다 clausure를 종료하고 ifPresent가 두 번 나타납니다.

더미 관점에서, 내 질문 수도 있습니다 : 포크/분기점/동일한 람다 식에서 두 가지 방향으로 맵 나누기 가능합니까?

*** 유진의 제안을 바탕으로 내가 그래서 혼란이 (내가이 상황에서 MyMethod라는 걱정하지 않는다 발생하지 않습니다에서 System.out.println하는 MyMethod라는 변경 성공적으로

Optional.ofNullable(onderneming.getOndernemingOfVestiging()).map(OndernemingOfVestigingType::getCode) 
     .ifPresent(o -> { 
      System.out.println(o.getValue().getValue()); 
      System.out.println(o.getBeschrijving().getValue()); 
     }); 

을했다. 그것은 수 인스턴스화 된 객체의 임의의 다른 메소드가 될 수 있습니다.

비록 그것이 작동하고 그것은 하나의 두 개의 람다 문장 대신 원래의 것보다 좋은 발전을 보였습니다. 나는 몇 가지 문제를 봅니다. "o.getValue(). getValue()"및 "o.getBeschrijving() .getValue() "는 안전하지 않은 null입니까? 다음

static class User { 

    private final Integer age; 

    private final String name; 

    public User(Integer age, String name) { 
     this.age = age; 
     this.name = name; 
    } 

    public Optional<Integer> getAge() { 
     return Optional.ofNullable(age); 
    } 

    public String getName() { 
     return name; 
    } 
} 

그리고 :

Optional<User> user = Optional.of(new User(null, "test")); 

    user.map(u -> Map.entry(u, u.getAge())) // this is java-9 Map.entry; but you can use a Pair or a List/array etc 
      .ifPresent(x -> { 
       System.out.println("name = " + x.getKey().getName()); 
       x.getValue().ifPresent(age -> { 
        System.out.println("age = " + age); 
       }); 
      }); 

당신은 동일하게 적용 할 수 u는 여기에 마음을하지 않는 경우에 나는 조금 여기 예를 단순화했습니다

+0

매핑에 'myMethod'를 사용 하시겠습니까, 아니면 여전히 원래 값입니까? – ByeBye

+2

['ifPresentOrElse'] (https://docs.oracle.com/javase/9/docs/api/java/util/Optional.html#ifPresentOrElse-java.util.function.Consumer-java.lang)을 살펴 보는 것은 어떻습니까? Runnable-) Java9에서 소개 되었습니까? – nullpointer

+0

@ Nullpointer, 고맙지 만 자바 9를 아직 사용할 수 없습니다. –

답변

2

당신은 그런 당신의 결과를 잡을 수 :

Optional.ofNullable(onderneming.getOndernemingOfVestiging()).map(OndernemingOfVestigingType::getCode) 
    .map(CodeOndernemingOfVestigingType::getValue) 
    .map(o -> { 
     myMethod("onderneming_type", o.getValue()); 
     return o.getBeschrijving(); 
    }) 
    .ifPresent(o -> myMethod("onderneming_type_omschrijving", o.getValue())); 

여러 줄의 람다가 나쁘고 읽기가 어렵 기 때문에 개인적인 방법으로 추출 할 수 있습니다.

편집 귀하의 Optional으로 분기하고자합니다. 수 없습니다 당신은 수행해야합니다

Optional<Code> op = Optional.ofNullable(onderneming.getOndernemingOfVestiging()) 
    .map(OndernemingOfVestigingType::getCode) 

op.map(CodeOndernemingOfVestigingType::getValue) 
    .ifPresent(o -> myMethod("onderneming_type", o.getValue())); 

op.map(CodeOndernemingOfVestigingType::getBeschrijving) 
    .ifPresent(o -> myMethod("onderneming_type_omschrijving", o.getValue())); 

일부 해킹보다 더 읽을 수 있어야합니다.

+0

... return o..getBeschrijving(); o (return ...)가 이전 O (o.getValue)와 다른 객체가 아니기 때문에 작동하지 않습니다. –

+0

좋아, 제 대답을 편집했습니다. 나는 당신이 가지기를 원한다는 것을 알지 못했다. – ByeBye

+0

나는 이것이 "branch"라는 것을 보지 못했다. 내가 "같은 람다 식으로 두 개의 다른 방향으로 포크/두 갈래/나누기지도"라고 말했을 때 나는 틀린 말로 표현했을 것입니다. BTW, 내 마지막 질문은 내 질문에 대한 최종 답변이라고 생각합니다. 나는 하나의 람다 문장으로 코드를 작성하는 것을 멈추고 나는 나의 질문의 맨 위에 올린 두 줄에 매우 가깝다는 것을 이해하는 당신의 생각을 따를 것입니다. –

1

내가 생각 해낸 것입니다 귀하의 의견에 일이

+0

내 문제를 이해했다고 생각하지만 내 제안에 정확하게 제안을 적용 할 수 없었습니다. 당신의 생각을 바탕으로, 나는 단지 하나의 람다 문장에서 작동하는 무언가를했지만 그것은 null 안전하다고 생각합니다. –