使用Comparator.comparing对String格式的float/double列表进行排序

Abh*_*oda 5 java java-8 java-stream

我想对以String格式提供的浮点值列表进行排序,例如,

"rate": "429.0",
"rate": "129.0",
"rate": "1129.0",...
Run Code Online (Sandbox Code Playgroud)

如果我使用Comparator.comparing(Room :: getRate),列表将按字符串顺序排序,这将是不正确的.所以我编写了下面的代码,我将String转换为float然后进行比较.

下面的代码对我来说很好,但它看起来很难看,还有更好的选择吗?

  stream().sorted(Comparator.comparing(Room::getRate, 
(s1, s2) -> (Float.parseFloat(s1) > Float.parseFloat(s2) ? 1 :-1)))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

Eug*_*ene 8

你可以替换Room::getRater -> Float.parseFloat(r.getRate()),然后它将成为:

  sorted(Comparator.comparing(
         r -> Float.parseFloat(r.getRate),
         Comparator.naturalOrder())
Run Code Online (Sandbox Code Playgroud)

要么

Comparator.comparingDouble(r -> Double.parseDouble(r.getRate()))
Run Code Online (Sandbox Code Playgroud)

  • `Comparator.comparingDouble(r - > Float.parseFloat(r.getRate()))`比较简短,将`float`扩展为`double`可能比在比较之前将每个`float`装箱到`Float`便宜.如果`Comparator.comparingDouble(r - > Double.parseDouble(r.getRate()))`变得更快,我甚至不会感到惊讶...... (3认同)