You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:45:26