如果密钥不存在,则过滤密钥值对的列表

时间:2017-03-01 07:36:04

标签: lambda java-8 java-stream

这里我们有一个Param对象列表,它基本上有两个属性 - 1.姓名 2.价值

我正在尝试使用stream -

获取具有特定名称的param的值
return paramList.stream().filter(param -> 
param.getName().equalsIgnoreCase("param_name"))
                .findAny()
                .map(param -> param.getValue()).get();

但是如果列表中没有名称为“param_name”的Param对象,则此方法会给我NullPointerException。我怎样才能避免它并获得一个空值。

2 个答案:

答案 0 :(得分:2)

我认为其中一个getName() - 调用会抛出NullPointerException,因为get()会抛出NoSuchElementException,如果它是空的并且没有其他可能null除了paramList本身之外的其他内容。

获取默认值的一种可能解决方案是,如果找不到param "param_name",请执行以下操作:

paramList.stream()
         .filter(Objects::nonNull) // filters out null params
         .filter(param -> Objects.nonNull(param.getName())) // filters out params with name null
         .filter(param -> param.getName().equalsIgnoreCase("param_name"))
         .findAny()
         .map(param -> param.getValue()) // or .map(ParamClass::getValue)
         .orElse(null); // your default

您可能还想查看Optional javadoc

如果您的getName - 方法比我们实际期望的更多,您可能需要用try/catch语句包围它。

答案 1 :(得分:1)

您可以过滤那些不存在的选项。像这样的东西

.map(param -> param.getValue())
.filter(Optional::isPresent)
.map(Optional::get)
.findAny()
.orElse("Not Found");