我有一个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
有人可以帮我吗。 预先感谢。
答案 0 :(得分:3)
首先,不需要进行split()
操作。您可以拆分所有片段,然后像这样将它们连接在一起,但是使用replace
或replaceAll
调用要简单得多。
第二,由于reduce操作会创建大量中间String
和StringBuilder
,因此其操作效率不是很高。相反,您应该使用String
加入Collector,这样效率更高:
String temp = list.stream()
.map(x -> x.name.replace(" ", "-"))
.collect(Collectors.joining("&&"));
答案 1 :(得分:2)
您编写的第二个map
操作会保留第一个单词。
相反,您可以在这里做什么:
用\\s
替换空格(-
为正则表达式)
Optional<String> temp = list.stream()
.map(x -> x.name)
.map(x -> x.replaceAll("\\s", "-"))
.reduce((str1, str2) -> str1 + "&&" + str2);
在空间上分开,然后与-
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","-"))