如何使用String流扩展(解析)Path

时间:2014-11-26 12:48:31

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

我有以下两个变量;

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?

感谢。

1 个答案:

答案 0 :(得分:3)

我更喜欢

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

你的组合器(p1, p2) -> 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())));