用lambda替换foreach替换

时间:2017-11-30 13:45:49

标签: lambda java-8 optional

我试图重写这段代码:

Integer lastValidIndex = 0;
if (value != null) {
    for(Entry<Key, Integer> entry : map.entrySet()) {
        Integer cur = entry.getValue();
        if (cur != null) {
            if( cur > value ) break;
            lastValidIndex = entry.getKey().getIndex();
        }
    }
}
return lastValidIndex;


return Optional.ofNullable(score).map(paramValue -> {
  Optional<Entry<PathwaysProgressType, Integer>> optionalEntry = 
        map.entrySet()
           .stream()
           .filter(entry -> entry.getValue() > paramValue)
           .findFirst();

  return optionalEntry
         .map(entry -> entry.getKey().getIndex())
         .orElse(0);
}).orElse(0);
你可以帮我找一下这个bug吗?好像,它工作正常,但不是。

2 个答案:

答案 0 :(得分:1)

如果你的目标是找到最后一个有效索引,这是一个有效的解决方案:

return Optional.ofNullable(score).map(paramValue -> 
     map.entrySet()
        .stream()
        .filter( entry -> entry.getValue() <= paramValue )
        .map( entry -> entry.getKey().getIndex() )
        .reduce( (previousIndex, curIndex) -> curIndex )
        .orElse(0)
).orElse(0);

您可以使用reduce函数获取最后一个有效索引

答案 1 :(得分:0)

试试这个:

return map.entrySet().stream()
            .filter(entry -> entry.getValue() != null && entry.getValue() > paramValue)
            .map(entry -> entry.getKey().getIndex())
            .findFirst()
            .orElse(0);