简体   繁体   English

Java 8 Lambda空值检查用法

[英]Java 8 lambda null check usage

I have a scenario where I am checking multiple attributes inside a class for null check.If its not null , I am calling a method which will create me a new object and I need to capture this instance against a reference.I am succesasfully able to do null check using maps but unable to write code which will help me in capturing the return object after invocation.Can someone please help ? 我有一种情况,我正在检查一个类中的多个属性以进行null检查。如果它不为null,则我正在调用一个将创建一个新对象的方法,并且需要针对引用捕获该实例。使用地图进行空检查,但无法编写代码,这将有助于我在调用后捕获返回对象。有人可以提供帮助吗?

    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;
}

Expected Now : 现在预计:

payloadEntries list should capture the returned object after each buildPayloadEntry call.I want something like below to be implemented along with lambda null checks payloadEntries列表应该在每次buildPayloadEntry调用之后捕获返回的对象。我希望像下面这样与lambda null检查一起实现

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

Updated Answer as per below suggestions 根据以下建议更新了答案

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);

If I understand correctly, you just need to transform (for example): 如果我理解正确,则只需进行转换(例如):

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

to

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM