【发布时间】:2026-02-10 22:10:01
【问题描述】:
有没有办法在 java 8 中比较列表中的元素?
我有兴趣重新编写两个 for 循环。
private static void test(List<Foo> a) {
for(int i = 0 ; i < a.size(); i++){
for(int j = 1; j < a.size() ; j++){
Foo o1= a.get(i);
Foo o2= a.get(j);
if (o1.getFooA().equals(o2.getFooA()) && !o1.getFooB().equals(o2.getFooB()) ) {
throw new Exception("some message goes here...");
}
}
}
}
有没有一种很酷的方法可以使用 lambdas/streams 或 java 8 遇到的任何其他功能?
【问题讨论】:
-
没有什么比这种传统方法使代码更具可读性了。
-
请注意,由于您的比较是对称的,因此您的比较是不必要的低效,因此比较
a with b将产生与b with a相同的结果,但您的嵌套循环会生成两个比较。因此,它的复杂性可以大大降低。为此,只需让第二个循环从int j = i开始,而不是int j = 1。因此,如果您有(1, 1)、(1, 2)和(2, 1)、(2, 2)之类的配对,则(2, 1)配对已过时,因为它已被(1, 2)覆盖。另请注意,您可以跳过j == i的情况,因为比较总是false,所以只需int j = i + 1。 -
嗨@Zabuza,谢谢你的来信,我一定会使用你的建议!您认为您的解决方案是否可以使用 lambda 或任何 java 8 功能来解决?
-
您当然可以使用流 API 执行此操作,但结果很可能不会比这更具可读性,甚至可能更糟。这不适合流 API,因为您必须同时遍历两个集合。
-
@Zabuza - 这不会改变复杂性。您的优化与原始的比较大约只有一半,但
N*N和N*N/2都属于O(N^2)复杂性类。
标签: java lambda collections java-8 java-stream