Java 8 streams “ifPresent”

2022-09-04 01:32:13

我正在尝试了解流并遇到一个问题:我想获取列表的最小值并将其分配给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);

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

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

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


答案 1

以下是我的做法:

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

答案 2

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

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

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

Integer absent = Integer.MIN_VALUE;

最简单的是使用orElse

Integer smallest = minimal.orElse(absent);

再长一点就好了isPresent

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

推荐