12

我正在尝试按相反的顺序(忽略大小写)对字符串数组进行排序,而不修改它,只打印它。所以我正在使用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())
        );
}

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

4

2 回答 2

24

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

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

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

将中间Comparator存储在一个变量中:

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()));
于 2014-04-08T13:10:52.747 回答
7

我找到了解决方案:

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

我认为语法的问题

 .sorted(String::toLowerCase)

是编译器然后期望将一个Object传递给String的实例方法toLowerCase。所以我需要自己制作lambda方法,不要忽略lambda参数(String)的类型,否则编译器仍然无法解析。

于 2014-04-08T12:42:15.633 回答