java流排序,字符串比较器忽略大小写

时间:2018-08-02 14:36:41

标签: java

hotels.stream().sorted(Comparator.comparing(Hotel::getCity)
                       .thenComparing(hotel -> hotel.getName().toUpperCase())))
                .collect(Collectors.toList());

请问是否有一种更简洁的编写.thenComparing(hotel -> hotel.getName().toUpperCase())的方法,我找到了String.CASE_INSENSITIVE_ORDER,但是如何在hotel.getName()上使用此比较器。

更新: 应用了@Arnaud Denoyelle的建议。

hotels.stream().sorted(Comparator.comparing(Hotel::getCity)
                       .thenComparing(Hotel::getName, String.CASE_INSENSITIVE_ORDER))
                .collect(Collectors.toList());

看起来更好。

2 个答案:

答案 0 :(得分:15)

String.CASE_INSENSITIVE_ORDERComparator<String>,但是您正在尝试比较一些Hotel

您可以这样获得Comparator<Hotel>

// Map hotel to a String then use the Comparator<String>
Comparator.comparing(Hotel::getName, String.CASE_INSENSITIVE_ORDER);

然后,如果只需要排序,则不需要使用Stream,则可以直接排序:

hotels.sort(Comparator.comparing(Hotel::getName, String.CASE_INSENSITIVE_ORDER));

因此,根据第一个比较标准,代码变为:

hotels.sort(
  Comparator.comparing(Hotel::getCity)
            .thenComparing(Hotel::getName, String.CASE_INSENSITIVE_ORDER)
)

答案 1 :(得分:0)

您应为 thenComparing 链接方法提供另一个比较器,如下所示:

hotels.stream().sorted(Comparator.comparing(Hotel::getCity)
            .thenComparing(Comparator.comparing(Hotel::getName, String.CASE_INSENSITIVE_ORDER)))
            .collect(Collectors.toList())