将 String 拆分为 Stream 的 最佳 方法是什么?
我看到了这些变化:
Arrays.stream("b,l,a".split(","))
Stream.of("b,l,a".split(","))
Pattern.compile(",").splitAsStream("b,l,a")
我的优先事项是:
- 鲁棒性
- 可读性
- 表现
一个完整的、可编译的 例子:
import java.util.Arrays;
import java.util.regex.Pattern;
import java.util.stream.Stream;
public class HelloWorld {
public static void main(String[] args) {
stream1().forEach(System.out::println);
stream2().forEach(System.out::println);
stream3().forEach(System.out::println);
}
private static Stream<String> stream1() {
return Arrays.stream("b,l,a".split(","));
}
private static Stream<String> stream2() {
return Stream.of("b,l,a".split(","));
}
private static Stream<String> stream3() {
return Pattern.compile(",").splitAsStream("b,l,a");
}
}
原文由 slartidan 发布,翻译遵循 CC BY-SA 4.0 许可协议
Arrays.stream
/String.split
由于
String.split
返回一个数组String[]
,我总是推荐Arrays.stream
作为流式传输数组的规范习惯用法。Stream.of
/String.split
Stream.of
是一个 可变参数 方法,它恰好接受一个数组,因为可变参数方法是通过数组实现的,并且当可变参数被引入 Java 并且现有方法被改造为接受可变参数时存在兼容性问题。Pattern.splitAsStream
Pattern.compile(",").splitAsStream(string)
具有直接流式传输而不是创建中间数组的优势。因此对于大量的子字符串,这可以带来性能优势。另一方面,如果定界符是微不足道的,即单个文字字符,String.split
实现将通过快速路径而不是使用正则表达式引擎。所以在这种情况下,答案并不简单。如果流式传输发生在另一个流中,例如
.flatMap(Pattern.compile(pattern) ::splitAsStream)
的优点是只需分析一次模式,而不是对外部流的每个字符串进行分析。这是
expression::name
形式的方法引用的一个属性,它将在创建功能接口的实例时评估表达式并捕获结果,如 什么是 System.out 的等效 lambda 表达式中所述: :println 和 java.lang.NullPointerException 使用方法引用而不是 lambda 表达式抛出