我有以下两个变量;
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?
感谢。
答案 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())));