java - 如何使用字符串流扩展(解析)路径

标签 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?

谢谢。

最佳答案

我更愿意

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())));

关于java - 如何使用字符串流扩展(解析)路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27149665/

相关文章:

JavaFX:TextFlow 中文本元素的 CSS 选择器

spring - Java 执行上下文类解释

java - Kotlin: 'public' 属性公开其 'local' 类型参数 <未提供名称>

java - 从 Arraylist 中提取不同字符串的更快方法

java - 在 eclipse 中使用 -parameters 选项进行反射

java - Java HashMap 列表

c++ - 什么都不捕获的 lambda 可以访问全局变量吗?

c++ - VS2010 中 C++ lambda 表达式的奇怪错误(变量 y1)

java - 解析日期的优雅解决方案

java - 设置了时区的 SimpleDateFormat 获得正确的值但时区错误