Java 8流" ifPresent"

时间:2016-07-31 20:27:24

标签: java lambda java-8 java-stream

我正在尝试了解流并遇到问题: 我想获取列表的最小值并将其分配给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. 我的问题最终是:如何将最小值分配给int smallest变量并检查ifPresent?

3 个答案:

答案 0 :(得分:8)

以下是我的表现:

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);
    }
}

答案 1 :(得分:6)

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;

答案 2 :(得分:2)

ifPresent方法将Consumer<? super T>作为参数。简单来说,它应该是没有return语句的动作。如果值存在,您可以打印该值,如

[...].ifPresent(System.out::print);

但这不是IDEA所说的。我想,您只需要保存Option<Integer>个实例,然后按isPresent进行检查:

Optional<Integer> o = list.stream().min(Integer::compareTo);
if (o.isPresent()) {
    smallest = o.get();
}

当然,orElse还有更方便的方式:

smallest = o.orElse(Integer.MIN_VALUE);

或使用三元运算符:

smallest = o.isPresent() ? o.get() : Integer.MIN_VALUE;