Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“Java 8流”;“如果存在”;_Java_Lambda_Java 8_Java Stream - Fatal编程技术网

“Java 8流”;“如果存在”;

“Java 8流”;“如果存在”;,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我试图了解streams,但遇到了一个问题: 我想得到一个列表的最小值,并把它赋给一个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.printl

我试图了解streams,但遇到了一个问题: 我想得到一个列表的最小值,并把它赋给一个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);
int smallest = list.stream().min(Integer::compareTo).ifPresent(integer -> integer);
不幸的是,这不起作用,因为我收到警告:
Lambda中的返回类型错误,无法将Integer转换为void。
我的最后一个问题是:如何通过检查ifPresent将最小值赋给
int minimable
变量?

以下是我的方法:

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);
    }
}
包lambdas;
导入java.util.ArrayList;
导入java.util.List;
/**
*迈克尔创作的
*创建日期2016年7月31日。
*@linkhttps://stackoverflow.com/questions/38688119/java-8-streams-ifpresent
*/
公共类最小示例{
公共静态void main(字符串[]args){
列表=新的ArrayList();
int minimest=list.stream().min(Integer::compareTo).orElse(Integer.min_值);
系统输出打印项次(最小);
}
}
流#min
返回结果的
可选
,因为在一般流中可以为空,所以不能有最小值

 Optional<Integer> minimal = list.stream().min(Integer::compareTo);
最简单的方法是使用
orElse

Integer smallest = minimal.orElse(absent);
稍长一点将是
isPresent

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

ifPresent
方法需要
consumery您首先必须理解为什么得到的是可选的,而不是整数:因为流可能是空的,因此可能没有任何最小值。然后,如果流是空的,您需要决定希望得到什么结果。然后,一旦你知道你想要什么,你就可以通过查看Optional的文档来选择获得结果的正确方法。
ifPresent
消费者
为参数,它使用输入值,不返回任何内容。提示:
list
初始化+添加可以通过
list list=Arrays.asList(1,2,3)简化
。因此orElse方法返回一个整数类型,而不是像.min方法那样的可选类型?是的,在本例中它将是
Integer
。通常,
可选
可以包含任何类型的值
T
,因此
orElse
返回该类型的值
T
非常感谢!一个小注释:通常,用于计算最小值的“不存在”值是
Integer.MAX\u value
,而用于计算最大值的“不存在”值是
Integer.MIN\u value
@Eth。其目的是返回一个表示特殊情况的值。(顺便说一句:它还允许一些简单的实现,比如
intresult=MAX\u VALUE;for(i:a)result=min(result,i);returnresult;
)。当然,对于
Integer
,人们可能会争论:
MIN\u VALUE
MAX\u VALUE
都是合法的结果。但当计算最小值时,返回最大值会提示根本找不到值。(这对于
Double
POSITIVE_INFINITY
来说更有意义)。在许多库中都是这样做的,可以称之为“最佳实践”,或者至少合理地满足预期。如果
.min
方法返回可选值,那么
.orElse
方法需要返回一个整数。
.orElse
是否调用
.get
方法?此代码运行并工作。你接受的答案支持了这一点。你的问题是什么?
Integer smallest = minimal.isPresent() ? minimal.get() : absent;
[...].ifPresent(System.out::print);
Optional<Integer> o = list.stream().min(Integer::compareTo);
if (o.isPresent()) {
    smallest = o.get();
}
smallest = o.orElse(Integer.MIN_VALUE);
smallest = o.isPresent() ? o.get() : Integer.MIN_VALUE;