【问题标题】:Lambda expression in java 8 (Null check in HashMap using java.util.Optional)java 8 中的 Lambda 表达式(使用 java.util.Optional 在 HashMap 中检查空值)
【发布时间】:2015-10-12 01:48:53
【问题描述】:

我是 java 8 的新手,正在学习 lambda 表达式。

我有一个界面。

配置.java

package com.raghu.example;

import java.util.Map;


public interface Configuration {

    public Map<String,String> getPayload();

}

接口的Impl:ConfigurationImpl.java

package com.raghu.example;

import java.util.HashMap;
import java.util.Map;

public class ConfigurationImpl implements Configuration {

    @Override
    public Map<String, String> getPayload() {
        Map<String,String> map = new HashMap<>();
        map.put("key1", "value1");
        map.put("key2", "value2");
        //return null;
        return map;
    }

}

我的主程序:Sample.java

package com.raghu.example;
import java.util.Optional;

public class Sample {

    Configuration config;

    /*
     * if config is null, return "";
     * if config.getPaylaod is null, return "";
     * if config.payload is not null and if key value is present, then return the value
     * if config.payload is not null and if invalid key, then return "";
     * 
     */

    String test(String key) {
        config = new ConfigurationImpl();
        String dataValue = "";

        /** java 7 
       if (StringUtils.isNotEmpty(key)) {
            try {
                String input= config.getPayload()==null?"":config.getPayloadmap().get(key);
                return (input!=null?input:"");
            } catch (Exception e) {
                return "";
            }
        }
        return "";
    }**/
        Optional.ofNullable(config).map(Configuration::getPayload).ifPresent(v->{final String str=v.get(key);System.out.println(str);});
//        //cdataValue=str;});
//        //Optional.ofNullable(config).map(Configuration::getPayload).ifPresent(v->{final String str=v.get(key);System.out.println(str);return str;});
       return dataValue;
    }

    public static void main(String[] args) {
       Sample s = new Sample();
       String value="";
       value=s.test("key"); //pass invalid , should return "";
       System.out.println(value);
       value=s.test("key1"); //pass invalid , should return actual value
       System.out.println(value);
    }

}

现在在方法测试中,我想做以下[“”]。

  1. 检查config是否为空,返回空字符串。
  2. 检查集合是否为空,返回空字符串。
  3. 如果collection不为null,并且key存在,则返回值,否则返回“”;

如何在 java 8 中做到这一点?

试过这个:

  1. 错误一:Void 方法不能返回值

    Optional.ofNullable(config).map(Configuration::getPayload).ifPresent(v->{final String str=v.get(key);System.out.println(str);return str;});
    
  2. 错误 2:在封闭范围内定义的局部变量 dataValue 必须是 final 或有效 final。

    Optional.ofNullable(config).map(Configuration::getPayload).ifPresent(v->{final String str=v.get(key);System.out.println(str);dataValue= str;});
    

添加 final 并不能解决。

还发布了 java 7 代码,我正在尝试使用 lambda 表达式解决 java 7 的 if-else 部分。

【问题讨论】:

    标签: java lambda java-8 optional


    【解决方案1】:

    你可以继续链接.map(...)。如果在任何步骤中发生 null ,它只会将整个事情变成一个空的Optional 然后orElse("") 将返回默认值。

    return Optional.ofNullable(config)
            .map(Configuration::getPayload)
            .map(c->c.get(key))
            .orElse("");
    

    【讨论】:

    • c-&gt;c.get(key) 可以替换为Map::get(key) :)
    • @Clashsoft,对我不起作用.. return Optional.ofNullable(config) .map(Configuration::getPayload) .map(Map::get(key)) .orElse("" );我在这里错过了什么吗?
    • @Clashsoft 我不相信有Map::get(key) 这样的东西。方法引用不能带参数。
    • 我的错 - 这确实是不可能的。虽然这是一个毫无意义的限制,因为没有技术原因这不能工作
    • @Clashsoft:反过来说:没有理由支持第二种语法来表达同样的事情。 c-&gt;c.get(key)完美描述了操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 2017-11-16
    • 1970-01-01
    相关资源
    最近更新 更多