“Java 8流”;“如果存在”;
我试图了解streams,但遇到了一个问题: 我想得到一个列表的最小值,并把它赋给一个int变量。 为此,我做了以下工作:“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
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;