在 Java 集合中查找最近的对象

Find closest object in Java collection

我有一个包含某些 int 字段的对象的集合。

例如

public class Foo {
    public int field;
}

我想得到一个值最接近特定值的元素(例如42)。

番石榴有什么巧妙的方法来实现这样的事情吗?

(不是 Guava,而是 Java 流):使用 Stream.min 和自定义比较器:

 List<Foo> list = ...
 Foo closest42 = list.stream()
      .min((f1,f2) -> Math.abs(f1.field - 42) - Math.abs(f2.field - 42)));

如果你特别想使用 Guava,你可以使用 Ordering:

final int target = 42;
Ordering<Foo> ordering = Ordering.natural().onResultOf(
    new Function<Foo, Integer>() {
      @Override public Integer apply(Foo foo) {
        return Math.abs(foo.field - target);
      }
    });

现在你可以简单的按照这个顺序求最小值:

Foo closest = ordering.min(iterableOfFoos);

但是,您可以按照@wero 的建议使用 Java 8 中的流来执行此操作。

在纯 java 中,您可以将集合缩减为与您的目标差异较小的元素:

myFoos.stream()
      .reduce((result, current) -> 
              Math.abs(42 - current.field) < Math.abs(42 - result.field) ? current : result);