使用流来查找Max

时间:2017-11-13 04:41:07

标签: java java-stream

以下是尝试使用流找到Max的推荐方法吗?

List<Employee> emps = new ArrayList<>();
emps.add(new Employee("Roy1",32));
emps.add(new Employee("Roy2",12));
emps.add(new Employee("Roy3",22));
emps.add(new Employee("Roy4",42));
emps.add(new Employee("Roy5",52));

Integer maxSal= emps.stream().mapToInt(e -> e.getSalary()).reduce((a,b)->Math.max(a, b));
System.out.println("Max " + maxSal);

导致编译错误 - 这是什么意思?

error: incompatible types: OptionalInt cannot be
nverted to Integer
                  Integer maxSal= emps.stream().mapToInt(e -> e.getSalary()).
uce((a,b)->Math.max(a, b));

4 个答案:

答案 0 :(得分:2)

您可以在reduce中使用Integer.min方法返回OptionalInt,可用于获取Int(确保边界检查)

使用IntStream

int max1 = emps.stream().mapToInt(Employee::getSalary).max().getAsInt();

使用IntSummaryStatistics [如果您对统计数据感兴趣,例如min,max,avg]

IntSummaryStatistics stats = emps.stream().mapToInt(Employee::getSalary).summaryStatistics();
int max2 = stats.getMax();

reduce功能

int max3 = emps.stream().mapToInt(Employee::getSalary).reduce(Integer::min).getAsInt();

答案 1 :(得分:1)

首先,可能会缩短emps初始化Arrays.asList(T...)

List<Employee> emps = Arrays.asList(new Employee("Roy1", 32), 
        new Employee("Roy2", 12), new Employee("Roy3", 22),
        new Employee("Roy4", 42), new Employee("Roy5", 52));

接下来,您可以使用OptionalInt.orElseThrow(Supplier<X>)来获取max ListRuntimeException

int maxSal = emps.stream().mapToInt(Employee::getSalary).max()
        .orElseThrow(() -> new RuntimeException("No Such Element"));
System.out.println("Max " + maxSal);

最后,

int maxSal = emps.stream().mapToInt(Employee::getSalary).max().orElse(-1);
System.out.println("Max " + maxSal);

答案 2 :(得分:0)

回答您的问题,问题是reduce方法将返回OptionalInt,因此如果您想拥有整数值,则需要调用.getAsInt()方法。

    Integer maxSal = emps.stream().mapToInt(e -> e.getSalary())
         .reduce((a,b)->Math.max(a, b)).getAsInt();

如果列表中没有最大值,您将获得需要处理的NoSuchElementException

答案 3 :(得分:-1)

max中已有IntStream方法。你不必重新发明轮子:

OptionalInt maxSal = emps.stream().mapToInt(Employee::getSalary).max();
System.out.println("Max " + maxSal);

max返回OptionalInt而不是Integer,因为列表中没有元素。您可以使用OptionalInt方法从中提取值:

maxSal.ifPresent(System.out::println);

或者:

System.out.println(maxSal.orElse(0));

或者:

System.out.println(maxSal.getAsInt());

后者可能会抛出异常,所以要小心。