使用java 8将逗号分隔的字符串列表到列表的映射

时间:2018-02-09 10:34:31

标签: java collections java-8 hashmap

我有一个逗号分隔字符串列表 -

List: format = <unique id, label>
----- values -----
ab123,X
cd123,Y
ab123,Y
cd123,Z
------------------

我想使用java 8将此列表转换为Map<String, List<String>>,其中key是唯一ID,值将是标签列表(Map<unique-id, List<label>>).

示例 -

Map[
ab123=List[X, Y],
cd123=List[Y, Z]
]

请你在这里帮助我,以便我可以使用java 8实现这一点。

如果我想使用dto class -

,也可以代替Map
Class A {
 private String id;
 private List<String> labelList;
 // Getters and Setters methods
}

我希望创建一个class A列表,例如 -

List[
A [id="ab123", labelList = List[X, Y],
A [id="cd123", labelList = List[Y, Z]
]

我怎么能得到它?

3 个答案:

答案 0 :(得分:4)

yourList.stream()
        .map(x -> x.split(",", 2))
        .collect(Collectors.groupingBy(
            x -> x[0],
            Collectors.mapping(x -> x[1], Collectors.toList())

));

答案 1 :(得分:1)

使用Java 8 stream api,执行您尝试的操作非常简单。我将分两步向你解释。

第一步:将全部转换为地图。

List<String> list = new ArrayList<>();
list.add("ab123,X");
list.add("cd123,Y");
list.add("ab123,Y");
list.add("cd123,Z");

Map<String, List<String>> result = list.stream()
    .map(e -> e.split(","))
    .collect(Collectors.groupingBy(
        e -> e[0], 
        Collectors.mapping(e -> e[1], Collectors.toList())
    ));

// print the result
result.entrySet().stream().forEach(System.out::println);

输出:

cd123=[Y, Z]
ab123=[X, Y]

一步一步:

  • list.stream()将您的列表转换为流。
  • map(e -> e.split(",")将您的字符串列表转换为两个值数组[key,value]的列表。
  • collect(...)使用相同的密钥对数组元素进行分组。

第二步:将地图转换为DTO

List<String> list = new ArrayList<>();
list.add("ab123,X");
list.add("cd123,Y");
list.add("ab123,Y");
list.add("cd123,Z");

List<MyAwesomeDto> result = list.stream()
    .map(e -> e.split(","))
    .collect(Collectors.groupingBy(
        e -> e[0],
        Collectors.mapping(e -> e[1], Collectors.toList())
    ))
    .entrySet()
    .stream()
    .map(e -> new MyAwesomeDto(e.getKey(), e.getValue()))
    .collect(Collectors.toList());

// print the result
result.stream().forEach(System.out::println);

我们只需添加一个步骤即可将所有地图Entry映射到DTO。

希望这会帮助你。

答案 2 :(得分:0)

使用正则表达式匹配来过滤所有与给定模式不匹配的字符串:

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

public class ListToMapExample {

    public static void main(String[] args) {
        final List<String> list = Arrays.asList("ab123,X", "cd123,Y", "ab123,Y", "cd123,Z", "incorrect string", "", "a");
        final Pattern pattern = Pattern.compile("^([^,]+),(.*)$");

        final Map<String, List<String>> map = list.stream()
                .map(pattern::matcher)
                .filter(Matcher::matches)
                .collect(Collectors.groupingBy(
                        matcher -> matcher.group(1), 
                        Collectors.mapping(
                                matcher -> matcher.group(2), 
                                Collectors.toList()
                        ))
                );

        System.out.println(map);
    }
}

输出:

{cd123=[Y, Z], ab123=[X, Y]}