3

In extension the previous question Java 8 - Calling a multi argument method from Collection.stream.map(), how can we update the values while collecting in collect() after stream().map() process?

String designation = "Engineer";
String preFix = "PRE_FIX";
List<String> names = new ArrayList<>();
names.add("ABC");
names.add("DEF");
names.add("GHI");
System.out.println(
    names.stream()
         .map(name -> 
              MyClass.createReport(name, designation))
         .collect(ArrayList::new, ArrayList::add, ArrayList::addAll));

public static String createReport(String name, String designation) {
   return ("Name:" + name + " - Designation:" + designation);
}

Output:

[Name:ABC - Designation:Engineer, Name:DEF - Designation:Engineer, 
 Name:GHI - Designation:Engineer]

Expected:

[PRE_FIX->Name:ABC - Designation:Engineer, PRE_FIX->Name:DEF - 
 Designation:Engineer, PRE_FIX->Name:GHI - Designation:Engineer]
LuCio
  • 5,055
  • 2
  • 18
  • 34
Spartan
  • 339
  • 1
  • 3
  • 14

2 Answers2

4

Use another map()

System.out.println(
      names.stream()
           .map(name -> FolderDiffGenerator.createReport(name, 
                        designation))**
           .map(result -> preFix + "->" +result)**
           .collect(ArrayList::new, ArrayList::add, ArrayList::addAll));
ernest_k
  • 44,416
  • 5
  • 53
  • 99
Spartan
  • 339
  • 1
  • 3
  • 14
1

Just add the prefix before the invocation to createReport:

names.stream()
     .map(name -> preFix + "->" + MyClass.createReport(name, designation))
     .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);

On another note, .collect(ArrayList::new, ArrayList::add, ArrayList::addAll); can be simplified to .collect(toCollection(ArrayList::new));:

names.stream()
     .map(name -> preFix + "->" + MyClass.createReport(name, designation))
     .collect(toCollection(ArrayList::new));
Ousmane D.
  • 54,915
  • 8
  • 91
  • 126