在Debian Stretch上使用Java 13.0.1的JShell:

    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");


这一切都有效(它两次列出主文件夹中的文件,并返回0)。

但是当我输入:

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


导致错误:


  找不到符号,符号:方法compareToIgnoreCase。


知道什么使compareToIgnoreCase失败吗?

最佳答案

hmPath,因此list(hm)返回Stream<Path>。类compareToIgnoreCases(...)中没有方法Path。如果要使用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((a, b) -> a.compareToIgnoreCase(b))
    .forEach(x -> p(x.substring(hm.toString().length() + 1)));

10-08 04:15