想象一下存储在有序列表中的分层路径及其验证
List<String> path = Lists.newArrayList("path","to","end");
Iterator<String> iterator = path.iterator();
while (iterator.hasNext()) {
if (iterator.next() == null) {
while (iterator.hasNext()) {
if (iterator.next() != null) {
throw new Exception("Invalid path");
}
}
}
}
该算法非常简单。
只有包含其所有后代的叶子或节点必须为空。
有效路径:
"path", "to", "end"
"path", "to", null
"path", null, null
null, null, null
路径无效:
"path", null, "end"
null, null, "end"
null, "to", "end"
null, "to", null
我正在寻找以功能方式重写它的方法。
答案 0 :(得分:3)
在Java 9中,您可以使用
if(path.stream().dropWhile(Objects::nonNull).anyMatch(Objects::nonNull))
throw new Exception("Invalid path");
逻辑很简单,首先,删除所有非null
值,直到遇到null
值(如果有),然后,如果有任何非null
值,则会失败
由于Java 8缺少the dropWhile
operation,我们必须预先安排替代操作,例如使用Collection API而不是Stream API:
int firstNull = path.indexOf(null);
if(firstNull>=0 && path.stream().skip(firstNull).anyMatch(Objects::nonNull))
throw new Exception("Invalid path");