有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java为什么是比较器。比较不适用于String::toLowerCase方法引用?

我试图按相反顺序对字符串数组进行排序(忽略大小写),而不修改它,只打印它。所以我使用的是Java8流。但是我做不到

以下是我的尝试:

package experimentations.chapter02;

import java.util.Arrays;
import java.util.Comparator;
import java.util.stream.Collectors;

public class StringStream {

    public static void main(String[] args) {
        sortStrings();
    }

    public static void sortStrings(){
        String[] stringsArray = "The quick brown fox has a dirty ladder".split("\\s+");
        System.out.println(
                Arrays.stream(stringsArray)
                .sorted(Comparator.comparing(String::toLowerCase).reversed())
                .collect(Collectors.toList())
        );
    }

}

这里的问题是String::toLowerCase在静态方法Comparator.comparing中不被接受

同时,我设法对数组进行排序,但修改了它:

public static void sortStrings(){
        String[] stringsArray = "The quick brown fox has a dirty ladder".split("\\s+");
        System.out.println(
                Arrays.stream(stringsArray)
                .map(String::toLowerCase)
                .sorted(Comparator.reverseOrder())
                .collect(Collectors.toList())
        );
}

那么,最简单的解决方法是什么


共 (2) 个答案

  1. # 1 楼答案

    我找到了解决办法:

     .sorted((String e) -> e.toLowerCase) 
    

    我认为语法的问题

     .sorted(String::toLowerCase)
    

    编译器然后希望将对象传递给实例方法toLowerCase of String。因此,我需要创建自己的lambda方法,而不忽略lambda参数(字符串)的类型,否则编译器仍然无法解析它

  2. # 2 楼答案

    问题是,Java无法推断某些复杂表达式的泛型类型。第一条语句有效,而第二条语句导致编译时错误:

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

    有几种方法可以解决这个问题。以下是其中三项:

    将中间比较器存储在变量中:

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

    使用String.CASE_INSENSITIVE_ORDER

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

    添加显式类型参数:

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