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}
这就是这篇文章的全部内容。