use*_*113 5 java collections java-8 java-stream
因此,我还是Java 8的新手,仍在努力将流API与传统的迭代和集合相关联。
因此,我有一个具有3个属性的对象“ UserData”的列表,该列表都是非规范化数据。
public class UserData {
private String primaryAccountNumber;
private String subAccountNumber;
private String currency;
}
Run Code Online (Sandbox Code Playgroud)
样本输入数据将像
PrimaryAccNumber SubAccNumber Currency
PA00 US00 USD
PA01 US01 USD
PA01 US02 USD
PA02 EU00 EUR
PA03 EU01 EUR
PA04 CA00 CAD
PA04 CA01 CAD
null IN00 INR
null IN01 INR
Run Code Online (Sandbox Code Playgroud)
预期的输出应该是这样的
USD -> PA00 -> [US00]
PA01 -> [US01,US02]
EUR -> PA02 -> [EU00]
-> PA03 -> [EU01]
CAD -> PA04 -> [CA00,CA01]
INR -> null (or dummykey)->[IN00,IN01]
Run Code Online (Sandbox Code Playgroud)
因此,我希望以某种方式对它进行规范化,以使输出结果是一个以货币为键的映射,而值应为另一个以主Acc和键与子帐户列表的值为键的映射。
Map<String, Map<String,List<String>>> normalizedData = //logic
Run Code Online (Sandbox Code Playgroud)
我当时正在考虑基本上采用这种老式的方式
至于我的思考过程,我必须创建2个列表副本(第一次迭代时在Currency中排序1个),对于嵌套地图,在Primary帐户中创建第二个副本。似乎效率不高,然后我看了看溪流,但看不到我如何使用它们,但是任何指导或想法都将不胜感激。
使用流非常简单。您最后需要几个嵌套的分组和一个映射。为了简洁起见,我假设您静态导入了java.util.stream.Collectors.*。
Map<String, Map<String, List<String>>> normalizedData = users.stream().collect(
groupingBy(UserData::getCurrency,
groupingBy(UserData::getPrimaryAccountNumber,
mapping(UserData::getSubAccountNumber, toList()))));
Run Code Online (Sandbox Code Playgroud)
请注意,groupingBy()不允许使用null键,因此您实际上可能必须使用虚拟键。