使用Java 8流来计算两个值之间的差异并返回min

时间:2018-01-07 01:27:45

标签: java java-8 java-stream

我有一个名字和年龄的人类:

public class Person {
    private int age;
    private String name;
}

有一个人和一个特定人X的列表,我想知道与年龄最接近X的人Y(即X.age - Y.age是与所有其他人比较的最小值):

public class Test {
    List<Pearson> persons // suppose this list contains elements

    public int calculate (Person p1, Person p2) {
        return  Math.abs(p1.getAge() - p2.getAge());
    }

    public Person process(Perosn X) {
        int nearest persons.stream()... // need help
    }
}

我想使用Stream API,但我不知道如何,我尝试了减少但它不起作用。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:3)

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

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);
}

答案 1 :(得分:2)

您使用min(Comparator<? super T> comparator)方法,例如

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与参考人之间的年龄差异,即始终为正数。