首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java8 streams "ifPresent“

Java8 streams "ifPresent“
EN

Stack Overflow用户
提问于 2016-08-01 04:27:24
回答 3查看 28.8K关注 0票数 14

我正在尝试学习streams,但遇到了一个问题:我想获取列表的最小值,并将其赋给一个int变量。为此,我做了以下工作:

代码语言:javascript
复制
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。问题是,在检查.isPresent之前,集成开发环境会给出一个警告,说明调用了Optional.get。为了解决这个问题,我使用了稍微不同的ifPresent方法,并尝试了以下方法:

代码语言:javascript
复制
int smallest = list.stream().min(Integer::compareTo).ifPresent(integer -> integer);

不幸的是,这不起作用,因为我得到了警告:Bad return type in Lambda, Integer cannot be converted to void.我的最后一个问题是:如何在检查ifPresent的情况下将最小值赋给int smallest变量?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-08-01 04:35:31

Stream#min返回结果的Optional,因为在一般情况下,流可以为空,因此不能有最小值。

代码语言:javascript
复制
 Optional<Integer> minimal = list.stream().min(Integer::compareTo);

要从Optional中获取值,您需要有一些回退值

代码语言:javascript
复制
Integer absent = Integer.MIN_VALUE;

最简单的方法是使用orElse

代码语言:javascript
复制
Integer smallest = minimal.orElse(absent);

更长一点的时间将是isPresent

代码语言:javascript
复制
Integer smallest = minimal.isPresent() ? minimal.get() : absent;
票数 9
EN

Stack Overflow用户

发布于 2016-08-01 04:34:54

我是这样做的:

代码语言:javascript
复制
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);
    }
}
票数 10
EN

Stack Overflow用户

发布于 2016-08-01 04:37:47

ifPresent方法接受Consumer<? super T>作为参数。简单地说,它应该是一个没有return语句的操作。如果值存在,则可以打印该值,如下所示

代码语言:javascript
复制
[...].ifPresent(System.out::print);

但这并不是IDEA所说的。我认为,您只需要保存一个Option<Integer>实例,然后通过isPresent检查它

代码语言:javascript
复制
Optional<Integer> o = list.stream().min(Integer::compareTo);
if (o.isPresent()) {
    smallest = o.get();
}

当然,使用orElse还有更方便的方法

代码语言:javascript
复制
smallest = o.orElse(Integer.MIN_VALUE);

或者使用三元运算符:

代码语言:javascript
复制
smallest = o.isPresent() ? o.get() : Integer.MIN_VALUE;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38688119

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档