Reputation: 746
I have a following String:
utm_campaign=some_campaign&utm_content=video&utm_medium=paidsocial&utm_source=facebook"
I want to split it into keys/values and put it into HashMap:
KEY: utm_campaign VALUE: some_campaign
...
etc
Also, before putting it into Map, i should replace utm with ga in this method:
private String convertUtmToGa(String utm) {
switch (utm) {
case "utm_medium":
return "ga:medium";
case "utm_campaign":
return "ga:campaign";
case "utm_source":
return "ga:source";
case "utm_content":
return "ga:adContent";
default:
return utm;
}
}
So I should get Map like this:
ga:campaign=some_campaign, ga:adContent=video, ga:medium=paidsocial
I tried with:
private Map<String, String> extractUtmMarks(String paramsString) {
if (paramsString != null) {
Map<String, String> params = new HashMap<>();
String[] paramsAndValues = paramsString.split("&");
for (String paramAndValue : paramsAndValues) {
String[] keyValueArray = paramAndValue.split("=");
if (keyValueArray.length == 2 && !keyValueArray[1].isBlank() && !isUtmMarkContainsMacro(keyValueArray[1])) {
String param = convertUtmMarkToGa(keyValueArray[0]);
if (!param.isBlank()) {
params.put(param, keyValueArray[1]);
}
}
}
return params;
}
return Collections.emptyMap();
}
But this code looks not good. Can i get a better solution?
Upvotes: 0
Views: 770
Reputation: 2685
Using Streams...
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
...
final String input = "utm_campaign=some_campaign&utm_content=video&utm_medium=paidsocial&utm_source=facebook";
final Map<String, String> map =
Arrays.stream(input.split("&")) // Stream of "K=V" strings
.map(subString -> subString.split("=")) // Returns 2 element array -- {K,V}
.collect(Collectors.toMap(tokens -> convertUtmToGa(tokens[0]), tokens -> tokens[1]));
Upvotes: 2
Reputation: 40057
You can also use streams but if your methods works, why change it?
&
=
String v =
"utm_campaign=some_campaign&utm_content=video&utm_medium=paidsocial&utm_source=facebook";
Map<String, String> map = Arrays.stream(v.split("&"))
.map(arr -> arr.split("="))
.collect(Collectors.toMap(a -> a[0], a -> a[1]));
map.entrySet().forEach(System.out::println);
Prints
utm_campaign=some_campaign
utm_medium=paidsocial
utm_content=video
utm_source=facebook
Upvotes: 1