使用Java8流计算两个值之间的差值并返回最小值

使用Java8流计算两个值之间的差值并返回最小值,java,java-8,java-stream,Java,Java 8,Java Stream,我有一个person类,其名称和年龄如下: public class Person { private int age; private String name; } 有一个人员列表和一个特定的人员X,我想知道在年龄上最接近X的人员Y(即X.age-Y.age是与所有其他人比较的最小值): 公共类测试{ 列出人员//假设此列表包含元素 公共整数计算(人员p1、人员p2){ 返回Math.abs(p1.getAge()-p2.getAge()); } 公众人物程序(Perosn

我有一个person类,其名称和年龄如下:

public class Person {
    private int age;
    private String name;
}
有一个人员列表和一个特定的人员X,我想知道在年龄上最接近X的人员Y(即X.age-Y.age是与所有其他人比较的最小值):

公共类测试{
列出人员//假设此列表包含元素
公共整数计算(人员p1、人员p2){
返回Math.abs(p1.getAge()-p2.getAge());
}
公众人物程序(Perosn X){
int nearest persons.stream()…//需要帮助吗
}
}
我想使用流API,但我不知道如何使用,我尝试了reduce,但它不起作用。有人能帮忙吗?

您可以使用这种方法,例如

public Person process(Person pRef) {
    return persons.stream()
                  .filter(p -> ! p.equals(pRef)) // never find pRef itself
                  .min((p1, p2) -> Integer.compare(Math.abs(p1.getAge() - pRef.getAge()),
                                                   Math.abs(p2.getAge() - pRef.getAge())))
                  .orElse(null);
}

其中
Math.abs(p1.getAge()-pRef.getAge())
p1
和参考人之间的年龄差,即始终为正数。

找出两个数字之间的最小差值:

public Person process(Person px) {
    int age = px.getAge();
    return persons.stream()
                  .filter(p -> !p.equals(px))
                  .min(Comparator.comparingInt(p -> Math.abs(p.getAge() - age)))
                  .orElse(null);
}

“需求”并没有明确说明您不应该匹配
pRef
。你已经做出了一个合理的假设,但它不一定正确。@Stephen那么在最坏的情况下,它总是会返回人x本身(如果不会有其他同龄的人)。是的。但这可能是正确的做法。关键是OP没有指定是否需要以不同方式处理该情况。这是一种您希望在筛选器中使用
==
进行对象比较的情况。从理论上讲,你可以有两个同名同龄的不同的人,并且不想同时过滤掉这两个人。@StephenC如果你不排除
pRef
,并且它在列表中,你只能找到另一个同龄的任意人。由于目标是找到最接近年龄的人,因此排除是隐含的。可能没有明确说明,因为
pRef
保证不在列表中,在这种情况下,过滤器是不必要的,但无害的。然而,我在回答中包含了它,以指出一个潜在的错误。是否保留由OP决定。
public Person process(Person px) {
    int age = px.getAge();
    return persons.stream()
                  .filter(p -> !p.equals(px))
                  .min(Comparator.comparingInt(p -> Math.abs(p.getAge() - age)))
                  .orElse(null);
}