Java Stream 获取对象列表中最大最小属性值
使用 Java Stream 和 Comparator 可以高效地找出对象列表中属性值的最大值和最小值。
假设有一个对象列表 List<Object> objects,其中每个对象都有一个属性值,可以通过以下步骤获取最大值和最小值:
- 创建一个
Comparator对象,根据属性值进行比较。假设属性值的类型是Integer,可以这样创建Comparator:
Comparator<Object> comparator = Comparator.comparing(obj -> ((Object) obj).getProperty());
- 使用
stream的reduce方法,传入一个BinaryOperator来实现对每个对象的属性进行比较。在这个BinaryOperator中,可以使用Comparator的compare方法来比较属性值,并返回较大或较小的值。
Optional<Object> maxProperty = objects.stream()
.reduce((obj1, obj2) -> comparator.compare(obj1, obj2) > 0 ? obj1 : obj2);
Optional<Object> minProperty = objects.stream()
.reduce((obj1, obj2) -> comparator.compare(obj1, obj2) < 0 ? obj1 : obj2);
- 最后,可以使用
Optional类的get方法获取最大和最小属性值的对象,或者使用orElse方法指定默认值,以防止列表为空时抛出NoSuchElementException异常。
Object max = maxProperty.orElse(null);
Object min = minProperty.orElse(null);
整个代码示例如下:
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
public class Main {
public static void main(String[] args) {
List<Object> objects = ...; // 初始化对象列表
Comparator<Object> comparator = Comparator.comparing(obj -> ((Object) obj).getProperty());
Optional<Object> maxProperty = objects.stream()
.reduce((obj1, obj2) -> comparator.compare(obj1, obj2) > 0 ? obj1 : obj2);
Optional<Object> minProperty = objects.stream()
.reduce((obj1, obj2) -> comparator.compare(obj1, obj2) < 0 ? obj1 : obj2);
Object max = maxProperty.orElse(null);
Object min = minProperty.orElse(null);
// 打印最大和最小属性值的对象
System.out.println("Max: " + max);
System.out.println("Min: " + min);
}
}
请注意,这里假设对象列表中的对象都有一个名为 getProperty 的方法来获取属性值。根据实际情况,你可能需要调整代码以适应你的对象结构和属性获取方式。
原文地址: https://www.cveoy.top/t/topic/o2hS 著作权归作者所有。请勿转载和采集!