功能样式验证算法

时间:2017-02-13 17:42:28

标签: java lambda functional-programming java-8 java-stream

想象一下存储在有序列表中的分层路径及其验证

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

我正在寻找以功能方式重写它的方法。

1 个答案:

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