Java 8 流“ifPresent”

新手上路,请多包涵

我正在尝试了解流并遇到一个问题:我想获取列表的最小值并将其分配给一个 int 变量。为此,我做了以下事情:

 List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    int smallest = list.stream().min(Integer::compareTo).get();
    System.out.println(smallest);

这很好用,结果我得到 1 。问题是 IDE 发出警告,即在检查 Optional.get 之前调用了 .isPresent 。为了解决这个问题,我使用了稍微不同的 ifPresent 方法并尝试了以下方法:

 int smallest = list.stream().min(Integer::compareTo).ifPresent(integer -> integer);

不幸的是,这不起作用,因为我收到警告: Bad return type in Lambda, Integer cannot be converted to void. 我的问题最后是:如何通过检查 ifPresent 将最小值分配给 int smallest 变量?

原文由 Stefan B 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

Stream#min 返回 Optional 结果,因为一般流可以为空,所以不可能有最小值。

  Optional<Integer> minimal = list.stream().min(Integer::compareTo);

要从 Optional 获得价值,你需要有一些后备价值

Integer absent = Integer.MIN_VALUE;

最简单的方法是使用 orElse

 Integer smallest = minimal.orElse(absent);

再长一点就是 isPresent

 Integer smallest = minimal.isPresent() ? minimal.get() : absent;

原文由 Nazarii Bardiuk 发布,翻译遵循 CC BY-SA 3.0 许可协议

我是这样做的:

 package lambdas;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by Michael
 * Creation date 7/31/2016.
 * @link https://stackoverflow.com/questions/38688119/java-8-streams-ifpresent
 */
public class MinimumExample {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        int smallest = list.stream().min(Integer::compareTo).orElse(Integer.MIN_VALUE);
        System.out.println(smallest);
    }
}

原文由 duffymo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题