Arrays.stream
/String.split
Since String.split https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/String.html#split(java.lang.String)返回一个数组String[]
,我总是推荐Arrays.stream
作为流式传输数组的规范习惯用法。
String input = "dog,cat,bird";
Stream<String> stream = Arrays.stream(input.split( "," ));
stream.forEach(System.out::println);
Stream.of
/String.split
Stream.of https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/stream/Stream.html#of(T...) is a varargs方法恰好接受一个数组,因为可变参数方法是通过数组实现的,并且当可变参数被引入Java并且现有方法经过改造以接受可变参数时存在兼容性问题。
Stream<String> stream = Stream.of(input.split(",")); // works, but is non-idiomatic
Stream<String> stream = Stream.of("dog", "cat", "bird"); // intended use case
Pattern.splitAsStream
Pattern.compile(",").splitAsStream(string) https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/regex/Pattern.html#splitAsStream(java.lang.CharSequence)具有直接流式传输而不是创建中间数组的优点。因此,对于大量子字符串,这可以带来性能优势。另一方面,如果分隔符很简单,即单个文字字符,则String.split
实现将通过快速路径而不是使用正则表达式引擎。所以在这种情况下,答案并非微不足道。
Stream<String> stream = Pattern.compile(",").splitAsStream(input);
如果流发生在另一个流内,例如.flatMap(Pattern.compile(pattern) ::splitAsStream)
优点是模式只需分析一次,而不是针对外部流的每个字符串。
Stream<String> stream = Stream.of("a,b", "c,d,e", "f", "g,h,i,j")
.flatMap(Pattern.compile(",")::splitAsStream);
这是以下形式的方法引用的属性expression::name
,它将在创建函数接口实例时计算表达式并捕获结果,如中所述System.out::println 的等效 lambda 表达式是什么 https://stackoverflow.com/q/28023364/2711488 and 使用方法引用而不是 lambda 表达式引发 java.lang.NullPointerException https://stackoverflow.com/q/37413106/2711488