如果目标字段值为空,请选择列表项备用字段值

时间:2018-06-06 09:31:09

标签: java lambda java-8

选择目标字段值的代码(' targetField'):

result = someList.stream()
   .filter(i -> i.geFilterField() == someValue)
   .map(i -> i.getTargetField())
   .findFirst()
   .orElse(null);

但是' targetFiled'是可空的。
如果目标字段值为空,我如何从替代字段中获取价值(某些' alterField')?

3 个答案:

答案 0 :(得分:2)

使用Optional#ofNullable可以选择

result = someList.stream()
                 .filter(i -> i.geFilterField() == someValue)
                 .map(i -> Optional.ofNullable(i.getTargetField())
                                   .orElse(i.getAlterField()))
                 .findFirst()
                 .orElse(null);

答案 1 :(得分:1)

如果您需要从对象中提取替代值,则可以按如下方式完成:

someList.stream()
   .filter(i -> i.geFilterField() == someValue)
   .map(i -> i.getTargetField() != null ? i.getTargetField() : i.getAlterField())
   .findFirst()
   .orElse(null);

答案 2 :(得分:0)

由于您只查找第一个项目,过滤“原始”项目,然后在只有一个对象时选择该字段,如下所示:

tmp = someList.stream()
   .filter(i -> i.geFilterField() == someValue && (i.getTargetField() != null || i.getAlterField() != null))
   .findFirst()
   .orElse(null);
// At this point tmp is either null if nothing is found, or
// it is an object with one or both target fields set to non-null values
result = null;
if (tmp != null) {
    result = tmp.getTargetField() != null ? tmp.getTargetField() : tmp.getAlterField();
}