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

2023-12-24

是什么best将字符串拆分为流的方法?

我看到了这些变化:

  1. Arrays.stream("b,l,a".split(","))
  2. Stream.of("b,l,a".split(","))
  3. Pattern.compile(",").splitAsStream("b,l,a")

我的首要任务是:

  • 鲁棒性
  • 可读性
  • 表现

一个完整的、可编译的example http://www.tutorialspoint.com/compile_java8_online.php?PID=0Bw_CjBb95KQMYnF0LVNvSnJrUnM:

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");
    }

}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将字符串拆分为字符串流? 的相关文章

随机推荐