Java 逻辑运算后用于排序的Lambda表达式
我有一个具有两个值的POJO,Java 逻辑运算后用于排序的Lambda表达式,java,lambda,java-8,java-stream,Java,Lambda,Java 8,Java Stream,我有一个具有两个值的POJO,val1和val2。我想找出差异,对集合进行升序排序,然后找到最接近零的值 public class Data { private String name; private int val1; private int val2; //getter-setter } 我想找出val1和val2之间的差异,然后对集合进行排序,使集合看起来像 List<Data> listOfData; listOfData.stream(
val1
和val2
。我想找出差异,对集合进行升序排序,然后找到最接近零的值
public class Data {
private String name;
private int val1;
private int val2;
//getter-setter
}
我想找出val1
和val2
之间的差异,然后对集合进行排序,使集合看起来像
List<Data> listOfData;
listOfData.stream()
.sorted((e1, e2) -> Integer.compare(e1.getVal1()-e1.getVal2(),
(e2.getVal1()-e2.getVal2())));
Example
Name1 16 67
Name2 10 60
Name3 27 30
Name4 17 13
我希望结果是Name3,因为它有最小的差异,我如何才能做到这一点?我的查询没有相应地排序
我设法这样实现了它,但我想把它转换成Lambda表达式
public void sortDifference(List<ResultantRow> tableRows, final boolean asc) {
Collections.sort(listOfData, new Comparator<Row>() {
@Override
public int compare(Row row1, Row row2) {
int differenceRow1 = difference(row1);
int differenceRow2 = difference(row2);
if (differenceRow1 > differenceRow2)
return asc ? 1 : -1;
else if (differenceRow1 < differenceRow2)
return asc ? -1 : 1;
return 0;
}
});
}
您希望将数据按升序排序,比较
val1
和val2
的绝对差异。为此,您可以使用:它返回一个比较器,用于比较给定提取器提取的int
值
Data data = listOfData.stream()
.sorted(comparingInt(d -> Math.abs(d.getVal1() - d.getVal2())))
.findFirst()
.get(); // or return null or throw an exception
由于排序是按升序进行的,这将返回绝对差值最接近0的数据。将普通old与相应的比较器一起使用更简单:
Data data = Collections.min(listOfData,
Comparator.comparingInt(d -> Math.abs(d.getVal1() - d.getVal2())));
注意溢流。两个任意
int
s之间的差值可能大于int
值范围。如果您的所有值都为正值,或者保证数值较小,则这不是问题,否则可能需要进行测量,例如使用long
s来表示差异。
Data data = Collections.min(listOfData,
Comparator.comparingInt(d -> Math.abs(d.getVal1() - d.getVal2())));