'Cannot find symbol' 使用 compareToIgnoreCase (JShell) 对文件流进行排序时
'Cannot find symbol' when sorting a stream of files using compareToIgnoreCase (JShell)
在 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");
一切正常(它两次列出主文件夹中的文件,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);
(上面的代码假设p
是this
对象的一个实例方法)
在 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");
一切正常(它两次列出主文件夹中的文件,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);
(上面的代码假设p
是this
对象的一个实例方法)