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

如何用Java 8 Streams计算两个列表元素的最小绝对差

嘿,很高兴你开始上手Java 8的Streams啦!这个求两个列表元素间最小绝对差的需求,用Streams其实可以很优雅地实现,核心就是要遍历所有元素对并计算差值,我给你详细讲讲怎么做:

核心思路

我们需要把两个列表的所有元素组合成对,计算每一对的绝对差,然后从这些差值里找出最小的那个。用Streams的话,flatMapToInt是实现“遍历所有元素对”的关键,它能把第一个列表的每个元素和第二个列表的所有元素做关联,展开成一个包含所有差值的流。

完整代码实现

import java.util.Arrays;
import java.util.List;
import java.util.OptionalInt;

public class MinAbsDifferenceExample {
    public static void main(String[] args) {
        List<Integer> list1 = Arrays.asList(5, 11, 17, 123);
        List<Integer> list2 = Arrays.asList(124, 14, 80);

        // 生成所有元素对的绝对差,然后找最小值
        OptionalInt minAbsoluteDifference = list1.stream()
                // 对list1的每个元素,映射到list2所有元素与它的绝对差的IntStream
                .flatMapToInt(num1 -> list2.stream()
                        .mapToInt(num2 -> Math.abs(num1 - num2)))
                // 找出流中的最小值
                .min();

        // 因为我们确定两个列表都非空,所以直接获取结果
        System.out.println("最小绝对差:" + minAbsoluteDifference.getAsInt()); // 输出1
    }
}

代码解释

  1. flatMapToInt的作用:list1.stream()生成第一个列表的元素流,对每个num1,我们用list2.stream()生成第二个列表的元素流,然后把每个num2转换成num1和num2的绝对差,最后通过flatMapToInt把这些小的IntStream合并成一个大的IntStream,这样所有差值都在同一个流里了。
  2. min()方法:IntStream的min()方法会返回一个OptionalInt,这是为了处理流为空的情况(比如其中一个列表是空的)。如果你的业务场景中两个列表不可能为空,直接用getAsInt()获取值就好;如果可能为空,可以用orElse()设置默认值,比如minAbsoluteDifference.orElse(Integer.MAX_VALUE),或者用ifPresent()来安全处理结果。

额外优化(针对大数据量场景)

如果你的列表元素非常多,上面O(n*m)时间复杂度的方法可能不够高效。这时候可以先把两个列表排序,然后用双指针法来找最小差值——不过这种方法更偏向于传统循环,但也可以结合Streams的排序操作:

// 先排序两个列表
List<Integer> sortedList1 = list1.stream().sorted().toList();
List<Integer> sortedList2 = list2.stream().sorted().toList();

// 然后用双指针法遍历(这里用循环实现,因为双指针不太适合纯Streams)
int i = 0, j = 0;
int minDiff = Integer.MAX_VALUE;
while (i < sortedList1.size() && j < sortedList2.size()) {
    int diff = Math.abs(sortedList1.get(i) - sortedList2.get(j));
    minDiff = Math.min(minDiff, diff);
    // 移动较小元素的指针
    if (sortedList1.get(i) < sortedList2.get(j)) {
        i++;
    } else {
        j++;
    }
}
System.out.println("最小绝对差:" + minDiff); // 同样输出1

这种方法的时间复杂度是O(n log n + m log m),比遍历所有元素对高效得多,适合大数据量的场景。

内容的提问来源于stack exchange,提问作者nikabu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:43:40