【问题标题】:functional style validation algorithm功能风格验证算法
【发布时间】:2017-02-13 17:42:27
【问题描述】:

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

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

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

【问题讨论】:

  • 我认为您的“有效路径”中有一些拼写错误,这使您的问题变得混乱。你的意思是在null 周围加上引号是那些地方吗?
  • @4castle thx,我修正了错字
  • 非功能性解决方案有什么问题?您自己说过-您的命令式算法简单明了且相对简单(我只会删除第二个嵌套的 while,因为您不需要它)。它不会从功能重写中获得任何好处,而且很可能只会获得复杂性(例如,我几乎可以肯定,功能实现将需要 Tuple 类)。

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


【解决方案1】:

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

【讨论】:

  • 因为您一直是 Java-8 的顶级用户之一,您能否提供一些有关 Java-9 功能的链接? :)
  • @Jude Niroshan:给你
猜你喜欢
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-12
  • 1970-01-01
相关资源
最近更新 更多