我有一个名字和年龄的人类:
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,但我不知道如何,我尝试了减少但它不起作用。有人可以帮忙吗?
答案 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
与参考人之间的年龄差异,即始终为正数。