takotsubo
takotsubo

Reputation: 746

Split String into keys and values to build Map

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

Answers (2)

Jamie Bisotti
Jamie Bisotti

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

WJS
WJS

Reputation: 40057

You can also use streams but if your methods works, why change it?

  • first split on the &
  • then on the =
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

Related Questions