Java8-Stream 查找最小值和最大值

By | 2022年2月15日

Best way to Find Min and Max from Stream Java 8

在这篇文章中,我们将学习如何在 Java Stream 中查找最大和最小数字、字符或对象。 我们将看到使用 Java 8 解决此类问题的最佳方法。

此外,我们将看到如何使用 Comparator.comparing() 方法从 Java 中的 Stream 中找到最小和最大对象。

在Stream中查找最大和最小数

要找到 Stream 中的最小值和最大值,只需先定义 Stream,然后我们将使用Comparator.comparing(Integer::valueOf) 方法,其工作方式与比较器相同。

下面是在 Stream 中查找最小值和最大值的完整代码:

import java.util.Comparator;
import java.util.stream.Stream;

public class MinMaxNumber {

  public static void main(String[] args) {

    Integer maxNumber = Stream.of(7, 3, 14, 99, 222, 49, 100)
        .max(Comparator.comparing(Integer::valueOf))
        .get();

    Integer minNumber = Stream.of(7, 3, 14, 99, 222, 49, 100)
        .min(Comparator.comparing(Integer::valueOf)).get();
    System.out.println("Max number in stream is "+ maxNumber);
    System.out.println("Min number in stream is "+ minNumber);
  }
}
// 输出
Max number in stream is 222
Min number in stream is 3

现在我们将看到如何使用 Java 8 中的 Stream 找到 String 中的最大和最小字符。

下面的部分解释了字符串中的最小最大字符。

查找最小和最大字符

同样,使用 Comparator.comparing() 方法在流中查找最小和最大字符的概念类似。

下面是这个的代码:

import java.util.Comparator;
import java.util.stream.Stream;

public class MinMaxChar {

  public static void main(String[] args) {
    char minChar = Stream.of('f', 'k', 'b', 'j', 's', 'e', 'p')
        .min(Comparator.comparing(Character::charValue)).get();

    char maxChar = Stream.of('f', 'k', 'b', 'j', 's', 'e', 'p')
        .max(Comparator.comparing(Character::charValue)).get();
    System.out.println("Max char in Stream is " + maxChar);
    System.out.println("Min char in stream is " + minChar);

  }
}
// 输出
Max char in Stream is s
Min char in stream is b

接下来是如何将此概念应用于自定义对象。 假设我们有一个像下面这样的 Employee 类。

public class Employee {

  private Integer employeeId;
  private String employeeName;
  private Integer employeeAge;

  public Employee() {

  }

  public Employee(Integer employeeId, String employeeName, Integer employeeAge) {
    this.employeeId = employeeId;
    this.employeeName = employeeName;
    this.employeeAge = employeeAge;
  }

  public Integer getEmployeeId() {
    return employeeId;
  }

  public void setEmployeeId(Integer employeeId) {
    this.employeeId = employeeId;
  }

  public String getEmployeeName() {
    return employeeName;
  }

  public void setEmployeeName(String employeeName) {
    this.employeeName = employeeName;
  }

  public Integer getEmployeeAge() {
    return employeeAge;
  }

  public void setEmployeeAge(Integer employeeAge) {
    this.employeeAge = employeeAge;
  }

  @Override
  public String toString() {
    return "Employee{" +
        "employeeId=" + employeeId +
        ", employeeName='" + employeeName + '\'' +
        ", employeeAge=" + employeeAge +
        '}';
  }
}

使用 Stream 的 Object By 属性中的 Min Max

这里要注意的一件重要事情是,我们可以根据某些属性从对象中找到最小值和最大值。 如果我们查看我们的员工类,那么我们可以使用任何属性来从流中查找最小值和最大值。

假设我们想要拥有最大年龄的客户,同时我们还想检查客户的最小年龄。 基本上,我们根据客户年龄找到最小值和最大值,我们只需编写 Comparator.comparing(Employee::getEmployeeAge) 之类的代码。

下面是这个的代码:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Stream;

public class MinMaxInObject {

  public static void main(String[] args) {

    List<Employee> employeeList = new ArrayList<Employee>();
    employeeList.add(new Employee(1, "Robert", 24));
    employeeList.add(new Employee(2, "Tom", 21));
    employeeList.add(new Employee(3, "Michel", 28));
    employeeList.add(new Employee(4, "Ricky", 23));

    Comparator<Employee> comparator = Comparator.comparing(Employee::getEmployeeAge);
    Employee minObject = employeeList.stream().min(comparator).get();
    Employee maxObject = employeeList.stream().max(comparator).get();
    System.out.println("Max Object " + maxObject);
    System.out.println("Min Object " + minObject);
  }
}
// 输出
Max Object Employee{employeeId=3, employeeName='Michel', employeeAge=28}
Min Object Employee{employeeId=2, employeeName='Tom', employeeAge=21}

这就是这篇文章的全部内容。