当前位置: 首页 > 面试题库 >

为什么Comparator.comparing无法与String :: toLowerCase方法参考一起使用?

巴学潞
2023-03-14
问题内容

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

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


问题答案:

问题是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()));


 类似资料:
  • 问题内容: 我正在阅读angularjs.org上的开发人员指南的指令部分,以刷新我的知识并获得一些见解,并且我尝试运行示例之一,但指令ng- hide不适用于自定义指令。 这里是jsfiddle:http : //jsfiddle.net/D3Nsk/: 知道为什么会这样吗? 解 似乎标记上的变量dialogIsHidden已经在指令中引用了作用域变量,而不是控制器中的变量;鉴于该指令具有其自己

  • 问题内容: 我刚刚下载了Hibernate 4.0.1最终版本的新版本。当我键入以下代码时,很奇怪: Eclipse IDE在STRING关键字上显示错误。我确定我的构建路径中有hibernatejar,并且还包含了以下代码: 我只是想知道为什么会发生这种情况? 问题答案: 因为该字段在4.0中不存在。 3.5中的现场文档说: 不推荐使用。 看到 http://opensource.atlassi

  • 问题内容: 我刚刚开始学习Java流,并遇到了问题。请看下面的例子。这是Node类的一部分: 我的意图是在流中的每个节点上使用名称和结果参数调用#findChildren。我尝试使用方法引用Node :: findChildren时没有运气。我将不胜感激的解决方案与运营商。 是否可以将方法引用与参数一起使用?我喜欢流的想法,我只想使代码更具可读性。 实际上,我认为还有一个类似的问题,方法引用具有读

  • 问题内容: 我有一个锚标记,ng-disabled指令根本不起作用。 它可以在按钮上工作,但是一旦我将Bootstrap的btn类添加到锚标记中,Angular的ng-disabled就可以正常工作了! 这如何运作? 问题答案: 仅适用于响应该属性的元素(输入,文本区域,单选按钮,按钮标签等)。在Bootstrap中,您必须将“ disabled”类添加到btn元素中。看起来像这样: 为此,请在指

  • 为什么编译器匹配字符串重载,而不是对象重载?

  • 描述 (Description) java.lang.String.toLowerCase()方法使用默认语言环境的规则将此String中的所有字符转换为小写。 声明 (Declaration) 以下是java.lang.String.toLowerCase()方法的声明 public String toLowerCase() 参数 (Parameters) NA 返回值 (Return Val