使用新的java 8流将Map <list>转换为List <newtype>

时间:2016-06-30 13:23:12

标签: collections java-8 java-stream

我需要使用java 8 streams API进行转换

的帮助
Map<String, List<Entry<Parameter, String>>> inputData

List<TestSession> testList

使用以下测试会话

private static class TestSession {
    final String mServiceName;
    final Parameter mParam;
    final String mData;
    public TestSession(
        final String aServiceName,
        final Parameter aParameter,
        final String aData) {
        mServiceName = aServiceName;
        mParam = aParam,
        mData= aData;
    }
}

enum Parameter {
    Foo,
    Bar,
    Baz
}

假设输入数据包含以下内容

{"ABC", {{Parameter.Foo, "hello"},{Parameter.Bar, "bye"} }
{"DEF", {{Parameter.Baz, "hello1"},{Parameter.Foo, "bye1"} }

我希望testList包含

{
   TestSession("ABC", Parameter.Foo, "hello"), 
   TestSession("ABC", Parameter.Bar, "bye"), 
   TestSession("DEF", Parameter.Baz, "hello1"),
   TestSession("DEF", Parameter.Foo, "bye1")
}

我们的想法是,每个TestSession都是使用inputData中的密钥和列表中每个条目的Entry<Parameter, String>构建的。

2 个答案:

答案 0 :(得分:1)

正如comment by the user “soon”中已经提到的,使用flatMapmap可以轻松解决此问题:

List<TestSession> list = mapList.entrySet().stream()
    .flatMap(e1 -> e1.getValue().stream()
        .map(e2 -> new TestSession(e1.getKey(), e2.getKey(), e2.getValue())))
    .collect(Collectors.toList());

答案 1 :(得分:0)

假设相应地调整了TestSession类以包含参数字段,您可以执行以下操作:

List<TestSession> result = inputData.entrySet().stream()
    .collect(
      ArrayList::new,
      (list, e1) -> e1.getValue().forEach((e2) ->
        list.add(new TestSession(e1.getKey(), e2.getKey(), e2.getValue()))),
      ArrayList::addAll);