在流Java中拆分字符串

时间:2018-08-08 18:25:53

标签: java string java-stream

我有一个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&&Acer-Keyboard&&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&&Acer&&Dell

有人可以帮我吗。 预先感谢。

6 个答案:

答案 0 :(得分:3)

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

第二,由于reduce操作会创建大量中间StringStringBuilder,因此其操作效率不是很高。相反,您应该使用String加入Collector,这样效率更高:

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

答案 1 :(得分: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);
    

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

您需要将map(x -> x.split(" "))的这一部分替换为map(x -> x.replaceAll("\\s","-"))