如何将String拆分为字符串流?

将String拆分为流的最佳方法是什么?

我看到了这些变化:

  1. Arrays.stream("b,l,a".split(","))
  2. Stream.of("b,l,a".split(","))
  3. 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 stream1() { return Arrays.stream("b,l,a".split(",")); } private static Stream stream2() { return Stream.of("b,l,a".split(",")); } private static Stream stream3() { return Pattern.compile(",").splitAsStream("b,l,a"); } } 

好吧,既然String.split返回一个数组,我总是建议使用Arrays.stream作为String.split数组的规范习惯用法。 Stream.of是一种varargs方法,恰好接受一个数组,因为varargs方法是通过数组实现的,并且当varargs被引入Java并且现有方法被改进以接受变量参数时存在兼容性问题。

Pattern.compile(",").splitAsStream(string)具有直接流式传输的优势,而不是创建中间数组。 因此,对于大量子字符串,这可以具有性能优势。 另一方面,如果分隔符很简单,即单个文字字符,则String.split实现将通过快速路径而不是使用正则表达式引擎。 所以在这种情况下,答案并非无足轻重。

如果流发生在另一个流内,例如.flatMap(Pattern.compile(pattern) ::splitAsStream) ,则有一个优点是模式只需要分析一次,而不是分析外部流的每个字符串。

关于(1)和(2)应该没有太大区别,因为你的代码几乎相同。
关于(3),这对于内存条件(不一定是CPU)会更有效,但在我看来,有点难以阅读。