当前位置: 首页 > 面试题库 >

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

邢浩邈
2023-03-14
问题内容

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

我看到了这些变化:

  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<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,将在创建功能接口的实例时对表达式进行评估并捕获结果,如[System.out ::println的等效lambda表达式中所述。使用方法引用而不是lambda表达式引发NullPointerException



 类似资料:
  • 问题内容: 我正在尝试找到一种将String拆分为String数组的方法,并且每当遇到白色香料时就需要对其进行拆分,例如 “嗨,我是保罗” 进入” “嗨”“我”“保罗” 如何使用RegularExpression在split()方法中表示空格? 问题答案: 您需要一个正则表达式,例如,这意味着: 每当遇到至少一个空格时就进行拆分 。完整的Java代码是:

  • 我正在开发android应用程序。我正在从图库中获取图像。此外,我正在从gallery获取图像路径。现在我的要求是,我只想获得具有扩展名的图像名称。我该怎么做?请帮帮我。 图像扩展名可以是任何或。我最终需要获得带有扩展名的图像名称。 即我想拆分上面的字符串,只得到。 我如何才能做到这一点?请在这方面帮助我。

  • 问题内容: 我需要将一个String拆分为单个字符String的数组。 例如,拆分“ cat”将得到数组“ c”,“ a”,“ t” 问题答案: 这将产生

  • 问题内容: 有没有办法在不知道字符串长度的情况下,将一个字符长的字符串切成4个字符串,每个字符长? 例如: 问题答案:

  • 问题内容: 我试图在网上四处寻找将字符串拆分为字符数组的答案,但似乎找不到一个简单的方法 似乎不像Ruby那样工作。有没有一种简单的方法可以不循环? 问题答案:

  • 我有一个字符串变量,它包括我试图排序的网格的列名。。 我希望将其拆分为一个包含4个值的字符串数组。我尝试了以下代码行: 然而,当我运行这个程序时,逗号仍然停留在该值上,因此我有例如和。如果没有逗号,如何拆分这些值?