我需要使用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>
构建的。
答案 0 :(得分:1)
正如comment by the user “soon”中已经提到的,使用flatMap和map可以轻松解决此问题:
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);