【问题标题】:Split string in a stream Java在流Java中拆分字符串
【发布时间】:2018-08-08 18:25:52
【问题描述】:

我有一个 POJO 类产品

List<Product> list = new ArrayList<>();
list.add(new Product(1, "HP Laptop Speakers", 25000));
list.add(new Product(30, "Acer Keyboard", 300));
list.add(new Product(2, "Dell Mouse", 150));

现在我想拆分列表以输出为HP-Laptop-Speakers&amp;&amp;Acer-Keyboard&amp;&amp;Dell-Mouse.

我只想要一个流中的衬里。 到目前为止,我已经设法得到了

Optional<String> temp = list.stream().
                   map(x -> x.name).
                   map(x -> x.split(" ")[0]).
                   reduce((str1, str2) -> str1 + "&&" + str2);
System.out.println(temp.get());

输出:HP&amp;&amp;Acer&amp;&amp;Dell

谁能帮帮我。 提前致谢。

【问题讨论】:

  • 你想加入,而不是分裂。加入 = 分几部分并构造一个字符串。 Split = 取一个字符串并提取几个部分。

标签: java string java-stream


【解决方案1】:

首先,split() 操作不是必需的。虽然您可以拆分所有部分,然后像这样将它们连接在一起,但使用 replacereplaceAll 调用要简单得多。

其次,reduce 操作不会非常有效,因为它会创建大量的中介 Strings 和 StringBuilders。相反,你应该使用String加入Collector,这样效率更高:

 String temp = list.stream()
              .map(x -> x.name.replace(" ", "-"))
              .collect(Collectors.joining("&&"));

【讨论】:

    【解决方案2】:

    您编写的第二个map 操作保留第一个单词。

    相反,你可以在这里做什么:

    1. 将空格(\\s 作为正则表达式)替换为 -

      Optional<String> temp = list.stream()
                                  .map(x -> x.name)
                                  .map(x -> x.replaceAll("\\s", "-"))
                                  .reduce((str1, str2) -> str1 + "&&" + str2);
      
    2. 空间分割,然后加入-

      Optional<String> temp  = list.stream()
                                   .map(x -> x.name)
                                   .map(x -> String.join("-", x.split("\\s")))
                                   .reduce((str1, str2) -> str1 + "&&" + str2);
      

    【讨论】:

      【解决方案3】:

      尝试在字符串流上使用收集器:

      .collect(Collectors.joining("&&"))
      

      【讨论】:

        【解决方案4】:

        执行此操作的一种简单方法是覆盖 Product 类中的 toString() 方法,以按照您希望的格式打印名称,然后遍历列表,将每个结果连接到更长的字符串上。

        【讨论】:

          【解决方案5】:
          Optional<String> temp = list.stream().map(x -> x.name)
                            .map(x -> x.replaceAll("\\s", "-"))
                            .reduce((str1, str2) -> str1 + "&&" + str2);
          

          【讨论】:

            【解决方案6】:

            您需要将这部分map(x -&gt; x.split(" ")) 替换为map(x -&gt; x.replaceAll("\\s","-"))

            【讨论】:

              猜你喜欢
              • 2020-08-10
              • 2015-03-30
              • 2012-03-21
              • 2013-02-07
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多