【问题标题】:How can I extend(resolve) a Path with a Stream of String如何使用字符串流扩展(解析)路径
【发布时间】:2015-01-24 19:28:19
【问题描述】:

我有以下两个变量;

final Path root;            // /a/b/c
final Stream<String> split; // 'd', 'e', 'f'

Path path;                  // /a/b/c/d/e/f

我想将split 中的每个元素解析为root

目前我正在尝试这样做。

// is the final combiner ok?
final Path path = split.reduce(root, (p, s) -> p.resolve(s), (p1, p2) -> p1);

这是正确的方法吗?有没有其他方法可以做到这一点?

下面的代码比上面的代码好吗?

Path path = root;
split.forEach(s -> path = path.resolve(s)); // path must be final?

谢谢。

【问题讨论】:

标签: java lambda java-8 reduce java-stream


【解决方案1】:

我更喜欢

Path root;
Stream<String> split;
Path path=split.map(Paths::get).reduce(root, Path::resolve);

您的组合器(p1, p2) -&gt; p1 不正常,因为它丢弃了第二个参数,而不是将它与第一个参数组合。它不会用于顺序处理,但是,应用程序代码中这样一个损坏的组合器将是一个定时炸弹。正确的组合器还是 Path.resolve,但是,在我的示例中,在这里使用 reduce(T, BinaryOperator) 更容易。

forEach 方法再好不过了,在局部变量的情况下它甚至不起作用。


请注意,这种多步解析的效率可能低于构造单个路径String 并执行一个解析操作:

import static java.util.stream.Collectors.joining;
…
Path path=root.resolve(split.collect(joining(root.getFileSystem().getSeparator())));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多