Comparator替代方案:同时间戳金额求和及最小时间戳匹配问题
解决方案
你遇到的问题在于stream.min()只会返回单个符合最小条件的元素,无法处理同时间戳下的金额求和。下面提供两种直接的实现方案:
方案一:先分组求和,再找最小时间戳
先按时间戳分组并累加对应金额,再从分组结果中找出时间戳最小的条目,输出其时间戳和总金额:
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; class Student { private String timestamp; private int amount; public Student(String timestamp, int amount) { this.timestamp = timestamp; this.amount = amount; } public String getTimestamp() { return timestamp; } public int getAmount() { return amount; } } public class Main { public static void main(String[] args) { List<Student> students = Arrays.asList( new Student("2022-06-06 14:19:37.000", 25), new Student("2022-06-06 14:19:37.000", 15) ); // 按时间戳分组,累加对应金额 Map<String, Integer> timestampTotalMap = students.stream() .collect(Collectors.groupingBy( Student::getTimestamp, Collectors.summingInt(Student::getAmount) )); // 找到最小的时间戳并输出结果 timestampTotalMap.keySet().stream() .min(String::compareTo) .ifPresent(earliestTs -> System.out.printf("%s, %d%n", earliestTs, timestampTotalMap.get(earliestTs))); } }
方案二:先找最小时间戳,再过滤求和
先提取所有时间戳找到最小值,再过滤出对应时间戳的元素并求和:
import java.util.Arrays; import java.util.List; import java.util.Optional; class Student { private String timestamp; private int amount; public Student(String timestamp, int amount) { this.timestamp = timestamp; this.amount = amount; } public String getTimestamp() { return timestamp; } public int getAmount() { return amount; } } public class Main { public static void main(String[] args) { List<Student> students = Arrays.asList( new Student("2022-06-06 14:19:37.000", 25), new Student("2022-06-06 14:19:37.000", 15) ); // 获取最小时间戳 Optional<String> earliestTimestampOpt = students.stream() .map(Student::getTimestamp) .min(String::compareTo); earliestTimestampOpt.ifPresent(earliestTs -> { // 过滤出对应时间戳的元素,求和金额 int totalAmount = students.stream() .filter(s -> s.getTimestamp().equals(earliestTs)) .mapToInt(Student::getAmount) .sum(); System.out.printf("%s, %d%n", earliestTs, totalAmount); }); } }
说明
- 方案一仅需遍历一次流完成分组,执行效率更高;方案二逻辑更直观,便于理解。
- 代码中使用
Optional.ifPresent()替代直接调用get(),避免空列表场景下抛出NoSuchElementException,提升代码鲁棒性。
内容的提问来源于stack exchange,提问作者user16897456
相关产品推荐
相关产品推荐

