3

I have a POJO class Product

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));

Now I want to split the list to get output as HP-Laptop-Speakers&&Acer-Keyboard&&Dell-Mouse.

I just want a single liner in stream. So far I have managed to get

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

Output: HP&&Acer&&Dell

Can someone help me out. Thanks in advance.

1
  • You want to join, not split. Join = take several parts and construct a single string. Split = take a single string and extract several parts. Commented Aug 8, 2018 at 18:30

6 Answers 6

3

First, the split() operation is not necessary. While you could split all the pieces and then join them together like that, it is far simpler to use a replace or replaceAll call instead.

Secondly, the reduce operation will not be very efficient since it is creating lots of intermediary Strings and StringBuilders. Instead, you should use the String joining Collector, which is more efficient:

 String temp = list.stream()
              .map(x -> x.name.replace(" ", "-"))
              .collect(Collectors.joining("&&"));
Sign up to request clarification or add additional context in comments.

Comments

2

The second map operation you write keep the first word.

Instead, here what you can do :

  1. Replace the spaces (\\s as regex) by a -

    Optional<String> temp = list.stream()
                                .map(x -> x.name)
                                .map(x -> x.replaceAll("\\s", "-"))
                                .reduce((str1, str2) -> str1 + "&&" + str2);
    
  2. Split on space, and then join with the -

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

Comments

1

Try to use collector on stream of strings:

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

Comments

0

One easy way to do this would be to override the toString() method in the Product class to print the name as you want it formatted and then iterate through the list concatenating each result onto a longer string.

Comments

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

Comments

0

you need to replace this portion map(x -> x.split(" ")) with map(x -> x.replaceAll("\\s","-"))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.