2016-07-04 6 views
0

У меня есть сценарий, где я проверяю несколько атрибутов внутри класса для проверки null. Если это не null, я вызываю метод, который создаст мне новый объект, и мне нужно будет захватить этот экземпляр против ссылки. Я успешно выполняю нулевую проверку с использованием карт, но не могу написать код, который поможет мне в захвате возвращаемого объекта после вызова. Может кто-то помочь?Java 8 lambda null check use

private WorkflowPreference buildWfPrefDetails(CcarReportPreferenceConfig ccarReportPreferenceConfig) { 
    WorkflowPreference workflowPreference = new WorkflowPreference(); 
    List<PayloadEntry> payLoadEntries = new ArrayList<PayloadEntry>(); 
    Optional.of(ccarReportPreferenceConfig) 
     .map(CcarReportPreferenceConfig::getRwpRole) 
     .map(RwpRole::getRoleName) 
     .ifPresent(s -> workflowPreference.setKey(s)); 
    Optional.of(ccarReportPreferenceConfig) 
     .map(CcarReportPreferenceConfig::getSequenceNumber) 
     .ifPresent(s -> buildPayLoadEntry("SEQ_NUM", s)); 
    Optional.of(ccarReportPreferenceConfig) 
     .map(CcarReportPreferenceConfig::getSlaType) 
     .ifPresent(s -> buildPayLoadEntry("SLA_TYPE", s)); 
    Optional.of(ccarReportPreferenceConfig) 
     .map(CcarReportPreferenceConfig::getSlaValue) 
     .ifPresent(s -> buildPayLoadEntry("SLA_VALUE", s.toString())); 
    Optional.of(ccarReportPreferenceConfig) 
     .map(CcarReportPreferenceConfig::getRejectSequence) 
     .ifPresent(s -> buildPayLoadEntry("REJECT_SEQUENCE", s)); 
    Optional.of(ccarReportPreferenceConfig) 
     .map(CcarReportPreferenceConfig::getRaiseQueryNotification) 
     .ifPresent(s -> buildPayLoadEntry("RAISE_QUERY_NOTIFICATION", s)); 
    workflowPreference.getValue().addAll(payLoadEntries); 
    return workflowPreference; 
} 

private PayloadEntry buildPayLoadEntry(String key, String value) { 
    PayloadEntry payloadEntry = new PayloadEntry(); 
    payloadEntry.setKey(key); 
    payloadEntry.setValue(value); 
    return payloadEntry; 
} 

Ожидаемое Сейчас:

payloadEntries список должен захватить возвращенный объект после каждого buildPayloadEntry call.I хотите что-то, как показано ниже, чтобы быть реализован вместе с лямбда нулевые чеки

payLoadEntries.add(buildPayLoadEntry("SEQ_NUM", ccarReportPreferenceConfig.getSequenceNumber())); 
payLoadEntries.add(buildPayLoadEntry("SLA_TYPE", ccarReportPreferenceConfig.getSlaValue().toString())); 

Обновлено Ответ в соответствии с ниже предложений

Optional.ofNullable(ccarReportPreferenceConfig) 
     .map(CcarReportPreferenceConfig::getRwpRole) 
     .map(RwpRole::getRoleName) 
     .ifPresent(s -> workflowPreference.setKey(s)); 
    Optional.ofNullable(ccarReportPreferenceConfig) 
     .map(CcarReportPreferenceConfig::getSequenceNumber) 
     .ifPresent(s -> payLoadEntries.add(buildPayLoadEntry("SEQ_NUM", s))); 
    Optional.ofNullable(ccarReportPreferenceConfig) 
     .map(CcarReportPreferenceConfig::getSlaType) 
     .ifPresent(s -> payLoadEntries.add(buildPayLoadEntry("SLA_TYPE", s))); 
    Optional.ofNullable(ccarReportPreferenceConfig) 
     .map(CcarReportPreferenceConfig::getSlaValue) 
     .ifPresent(s -> payLoadEntries.add(buildPayLoadEntry("SLA_VALUE", s.toString()))); 
    Optional.ofNullable(ccarReportPreferenceConfig) 
     .map(CcarReportPreferenceConfig::getRejectSequence) 
     .ifPresent(s -> payLoadEntries.add(buildPayLoadEntry("REJECT_SEQUENCE", s))); 
    Optional.ofNullable(ccarReportPreferenceConfig) 
     .map(CcarReportPreferenceConfig::getRaiseQueryNotification) 
     .ifPresent(s -> payLoadEntries.add(buildPayLoadEntry("RAISE_QUERY_NOTIFICATION", s))); 
    workflowPreference.getValue().addAll(payLoadEntries); 
+1

По-видимому, вы уже знаете о существовании 'операции map'. Поэтому непонятно, почему вы вместо этого используете 'ifPresent'. Но большой вопрос: * что * вы ожидаете, что будете потенциально «нулевыми»? – Holger

+4

Посмотрите на 'Objects.requireNonNull (ref)', который вычисляет ref, если ref не равен NULL, и выбрасывает, если это так. Он был предназначен для облегчения проверки предварительных условий. –

ответ

1

Если я понимаю правильно, вам просто нужно преобразовать (например):

Optional.of(ccarReportPreferenceConfig) 
     .map(CcarReportPreferenceConfig::getSequenceNumber) 
     .ifPresent(s -> buildPayLoadEntry("SEQ_NUM", s)); 

в

Optional.of(ccarReportPreferenceConfig) 
     .map(CcarReportPreferenceConfig::getSequenceNumber) 
     .ifPresent(s -> payLoadEntries.add(buildPayLoadEntry("SEQ_NUM", s))); 
+0

Предпочитаете 'Optional.ofNullable'' 'Optional.of'. Последнее предполагает, что аргумент не имеет значения null, тогда как первый преобразует значение null в 'Optional.empty()'. – Jubobs

+3

@Jubobs no. Если ccarReportPreferenceConfig не должен быть нулевым, я хочу, чтобы код быстро проваливался, бросая NPE, сигнализируя об ошибке, вместо того, чтобы молча воспроизводить неверные результаты. –

+0

@JBNizet В этом случае, если он возвращает без обработки его fine.I не хочу, чтобы что-то произошло, если мой объект равен нулю – Balaji