我有一个包含某些int
字段的对象的集合。
例如
public class Foo {
public int field;
}
我想获得一个与某个值具有最接近值的元素(例如42
)。
番石榴是否有任何巧妙的方法来实现这一目标?
答案 0 :(得分:7)
(不是Guava,而是Java流):使用Stream.min
和自定义比较器:
List<Foo> list = ...
Foo closest42 = list.stream()
.min((f1,f2) -> Math.abs(f1.field - 42) - Math.abs(f2.field - 42)));
答案 1 :(得分:6)
如果您特别想使用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);
但是,您可以使用Java 8中的流来执行此操作,如@wero所建议的那样。
答案 2 :(得分:3)
在纯java中,您可以将集合减少到其元素,与目标的差别较小:
myFoos.stream()
.reduce((result, current) ->
Math.abs(42 - current.field) < Math.abs(42 - result.field) ? current : result);