gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:40:14 26 4
gpt4 key购买 nike

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

我看到了这些变化:

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

我的优先事项是:

  • 稳健性
  • 可读性
  • 性能

一个完整的、可编译的example :

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

自从 String.split返回一个数组 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是一个 varargs 方法,它恰好接受一个数组,因为 varargs 方法是通过数组实现的,并且当 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)具有直接流式传输而不是创建中间数组的优点。因此,对于大量子字符串,这可以带来性能优势。另一方面,如果分隔符是微不足道的,即单个文字字符,则 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 形式的方法引用的一个属性,它会在创建函数式接口(interface)的实例时计算表达式并捕获结果,如 What is the equivalent lambda expression for System.out::println 中所述和 java.lang.NullPointerException is thrown using a method-reference but not a lambda expression

关于java - 如何将字符串拆分为字符串流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40932813/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com