首页 > 解决方案 > 将字符串拆分为键和值以构建 Map

问题描述

我有以下字符串: utm_campaign=some_campaign&utm_content=video&utm_medium=paidsocial&utm_source=facebook" 我想将其拆分为键/值并将其放入 HashMap:

KEY: utm_campaign VALUE: some_campaign
...
etc

另外,在将其放入 Map 之前,我应该在此方法中将 utm 替换为 ga:

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;
        }
    }

所以我应该得到这样的地图:

ga:campaign=some_campaign, ga:adContent=video, ga:medium=paidsocial

我试过:

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();
    }

但是这段代码看起来不太好。我能得到更好的解决方案吗?

标签: java

解决方案


使用流...

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]));

推荐阅读