'Cannot find symbol' 使用 compareToIgnoreCase (JShell) 对文件流进行排序时

'Cannot find symbol' when sorting a stream of files using compareToIgnoreCase (JShell)

Debian Stretch 上使用 java 13.0.1JShell

    import static java.nio.file.Files.*;
    var hm=Path.of(System.getProperty("user.home"));
    void p(String s) {System.out.println(s);}
    list(hm).sorted((a,b)->a.compareTo(b)).forEach(x -> p(x.toString().substring(hm.toString().length()+1)));
    list(hm).sorted().forEach(x -> p(x.toString().substring(hm.toString().length()+1)));
    "a".compareToIgnoreCase("A");

一切正常(它两次列出主文件夹中的文件,returns 0)。

但是当我输入:

    list(hm).sorted((a,b)->a.compareToIgnoreCase(b)).forEach(x -> p(x.toString().substring(hm.toString().length()+1)));

导致错误:

Cannot find symbol, symbol: method compareToIgnoreCase.

知道是什么让 compareToIgnoreCase 失败了吗?

hm是一个Path, thus list(hm) returns a Stream<Path>. There is no method compareToIgnoreCases(...) in class Path. If one wants to use compareToIgnoreCase from String,需要先将Path转换成String,例如通过调用 toString():

list(hm)
    .sorted((a,b) -> a.toString().compareToIgnoreCase(b.toString()))
    .forEach(x -> p(x.toString().substring(hm.toString().length() + 1)));

看看在流链中做了什么,在进一步执行之前将条目映射到 String 似乎是明智的:

list(hm)
    .map(Path::toString) // convert Stream<Path> to Stream<String>
    .sorted(String::compareToIgnoreCase)
    .map(x -> x.substring(hm.toString().length() + 1))
    .forEach(this::p);

(上面的代码假设pthis对象的一个​​实例方法)