使用Java8流计算两个值之间的差值并返回最小值
我有一个person类,其名称和年龄如下:使用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
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);
}