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

时间:2015-12-06 12:01:06

标签: java lambda java-8 java-stream

我有一个包含2个值的POJO,val1val2。我想找到差异,按升序对集合进行排序,找到最接近零的值。

public class Data {
    private String name;
    private int val1;
    private int val2;
    //getter-setter
}

我想找到val1val2之间的区别,然后对集合进行排序,因此集合看起来像

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

            });
}

我的区别是

return Math.abs(row.getVal1() - row.getVal2());

2 个答案:

答案 0 :(得分:2)

您希望按照升级顺序对数据进行排序,比较val1val2的绝对差异。为此,您可以使用Comparator.comparingInt(keyExtractor):这会返回一个比较器,用于比较给定提取器提取的int值。

Data data = listOfData.stream()
                      .sorted(comparingInt(d -> Math.abs(d.getVal1() - d.getVal2())))
                      .findFirst()
                      .get(); // or return null or throw an exception

由于排序是按升序排列的,这将返回绝对差异最接近0的数据。

答案 1 :(得分:2)

将普通的旧Collections.min()与相应的比较器一起使用会更简单:

[
  {
    "ip": "8.8.4.4/32",
    "port": 25,
    "proto": "tcp"
  },
  {
    "ip": "212.40.11.20/32",
    "port": 25,
    "proto": "tcp"
  },
  {
    "ip": "212.40.11.30/32",
    "port": 3389,
    "proto": "tcp"
  }
]