I'm a Java 7 person, and I was ordered to never use the for-loop again, only with an incomplete language on the cheek. I need to take Map<String, String>and finally get a string of command line parameters, as in the output of the following code (ignoring the current line at the moment):
forLoop: --name5 "value5"--name4 "value4"--name3 "value3"--name2 "{\"x\": \"y\"}"--name1 "value1"
resetAllValues: --name5 "value5"--name4 "value4"--name3 "value3"--name2 "{\"x\": \"y\"}"--name1 "value1"
streamy: --name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name2 "{\"x\": \"y\"}"--name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name2 "{\"x\": \"y\"}"--name1 "value1"--name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name2 "{\"x\": \"y\"}"--name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name5 "value5"--name5 "value5"--name4 "value4"--name5 "value5"--name5 "value5"--name4 "value4"--name3 "value3"--name2 "{\"x\": \"y\"}"--name1 "value1"
Names / keys remain unchanged. Values must be enclosed in double quotation marks, and all existing double quotation marks must be escaped ( \"). Closed quotation marks must be followed by a space.
I did this before java-8 in forLoopand partly with threads in resetAllValues, which actually modifies every entry. streamyone is incorrect because it repeatedly adds all current output to the next element ...
How can this be done efficiently with threads? And how can this be done in such a way as not to change the map entries or to use the builder? I do not see this yet.
package working;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class Temp {
public static void main(String[] cmd_lineParams) {
Map<String, String> map = new HashMap<>(5);
map.put("name1", "value1");
map.put("name2", "{\"x\": \"y\"}");
map.put("name3", "value3");
map.put("name4", "value4");
map.put("name5", "value5");
forLoop(map);
resetAllValues(new HashMap<String, String>(map));
streamy(new HashMap<String, String>(map));
}
private static final Matcher matcher = Pattern.compile("\"").matcher("ignored input");
private static final void forLoop(Map<String, String> map) {
StringBuilder builder = new StringBuilder();
for(Map.Entry<String, String> entry : map.entrySet()) {
String value = matcher.reset(entry.getValue()).replaceAll("\\\\\"");
builder.append("--").append(entry.getKey()).append(" \"").append(value).append("\"");
}
System.out.println("forLoop: " + builder.toString());
}
To be continued ...
private static final void resetAllValues(Map<String, String> map) {
map = map.entrySet().stream()
.collect(Collectors.toMap(entry -> entry.getKey(),
entry -> matcher.reset(entry.getValue()).replaceAll("\\\\\\\"")));
StringBuilder builder = new StringBuilder();
for(Map.Entry<String, String> entry : map.entrySet()) {
builder.append("--").append(entry.getKey()).append(" \"").append(entry.getValue()).append("\"");
}
System.out.println("resetAllValues: " + builder.toString());
}
private static final void streamy(Map<String, String> map) {
StringBuilder builder = new StringBuilder();
map.forEach((k,v) -> builder.append(
builder.append("--").append(k).append(" \"").append(
matcher.reset(v).replaceAll("\\\\\"")).append("\"")));
System.out.println("streamy: " + builder.toString());
}
}
(My nine-year-old says that I need to say “difficulty” somewhere in this matter. So: difficulty.)