我有一个包含2个值的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;
}
});
}
我的区别是
return Math.abs(row.getVal1() - row.getVal2());
答案 0 :(得分:2)
您希望按照升级顺序对数据进行排序,比较val1
和val2
的绝对差异。为此,您可以使用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"
}
]