Java 逻辑运算后用于排序的Lambda表达式

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(

我有一个具有两个值的POJO,
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())));