I want to use Java 8 threads to convert String values to a single string. A list of values, such as "A", "B", should return a String as "Values:" A "," B "added." This works fine, however I want to change Pre- and Postfix depending on the number of values. For example, if I have a list with only "A", I want the resulting row to be "Value" A added. "
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.List;
public class HelloWorld
{
public static void main(String[] args)
{
List<String> values = new ArrayList<>();
values.add("A");
values.add("B");
values.add("C");
List<String> value = new ArrayList<>();
value.add("A");
System.out.println(log(values));
System.out.println(log(value));
}
public static String log(List<String> values){
return values.stream()
.map(x -> "'" + x + "'")
.collect(Collectors.joining(",","values:"," added"));
}
}
Is there a way to change the Collctor, depending on the size of the resulting list? Then I could do something like
.collect(Collectors.joining(",", size = 1 ? "Value " : "Values: "," added"));
I would prefer a single-thread operation without an intermediate result. I also do not know the result in advance, because I am filtering the stream.
: , . . !
import java.util.stream.Collectors;
import java.util.ArrayList;
import java.util.List;
public class HelloWorld
{
public static void main(String[] args)
{
List<String> oldValues = new ArrayList<>();
oldValues.add("A");
oldValues.add("B");
oldValues.add("C");
List<String> newValues = new ArrayList<>();
newValues.add("A");
newValues.add("C");
newValues.add("D");
newValues.add("E");
System.out.println(HelloWorld.<String>log(oldValues, newValues, " deleted"));
System.out.println(HelloWorld.<String>log(newValues, oldValues, " added"));
}
public static <T> String log(List<T> first, List<T> second, String postfix) {
return (String) first
.stream()
.filter(x -> !second.contains(x))
.map(x -> "'" + x.toString() + "'").
collect(Collectors.collectingAndThen(Collectors.toList(),
list -> {
if (list.size() == 1) {
return "Value " + list.get(0) + postfix;
}
if (list.size() > 1) {
List<String> strings = new ArrayList<>(list.size());
for (Object object : list) {
strings.add(object.toString());
}
return "Values: " + String.join(",", strings) + postfix;
}
return "";
}));
}
}
:
Value 'B' deleted
Values: 'D','E' added