在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失败吗?
最佳答案
hm
是Path
,因此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)));