Why Comparator.comparing doesn't work with String::toLowerCase method reference?

后端 未结 2 1351
余生分开走
余生分开走 2020-12-19 00:01

I am trying to sort an array of Strings by reverse order (ignoring case), without modifying it, and just printing it. So I am using Java8 stream. But I can\'t manage to do i

2条回答
  •  -上瘾入骨i
    2020-12-19 01:04

    The problem is, that Java can not deduce the generic types for some complex expressions. The first statement works, whereas the second statement leads to a compile-time error:

    Comparator comparator = Comparator.comparing(String::toLowerCase);
    Comparator comparator = Comparator.comparing(String::toLowerCase).reversed();
    

    There are several ways to solve the problem. Here are three of them:

    Store the intermediate Comparator in a variable:

    Comparator comparator = Comparator.comparing(String::toLowerCase);
    System.out.println(
                Arrays.stream(stringsArray)
                .sorted(comparator.reversed())
                .collect(Collectors.toList()));
    

    Use String.CASE_INSENSITIVE_ORDER:

    System.out.println(
                Arrays.stream(stringsArray)
                .sorted(String.CASE_INSENSITIVE_ORDER.reversed())
                .collect(Collectors.toList()));
    

    Add explicit type parameters:

    System.out.println(
                Arrays.stream(stringsArray)
                .sorted(Comparator.comparing(String::toLowerCase).reversed())
                .collect(Collectors.toList()));
    

提交回复
热议问题