2016-07-04 22 views
0

我遇到的情況,我檢查一類中的多個屬性爲空check.If其不爲空,我打電話,這將創造我一個新的對象的方法,我需要抓住這個實例反對參考。我成功地使用地圖做空檢查,但無法編寫代碼,這將幫助我在調用後捕獲返回對象。可以請某人幫忙嗎?的Java 8拉姆達空檢查使用

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想要的東西像下面要與拉姆達一起實施null檢查

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'代替。但是最大的問題是*你期望可能會'null'是什麼? – Holger

+4

看看'Objects.requireNonNull(ref)',如果ref是非空值,則返回ref,如果是則拋出。它旨在促進先決條件檢查。 –

回答

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轉換爲'Optional.empty()'。 – Jubobs

+3

@Jubobs no。如果ccarReportPreferenceConfig不應該爲null,我希望代碼通過拋出一個NPE指示錯誤而快速失敗,而不是默默地返回不正確的結果。 –

+0

@JBNizet在這種情況下,如果它返回,並且不處理其fine.I什麼都不想發生,如果我的對象爲空 – Balaji