使用Java 8构建List数据并将其规范化为映射结构

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)

我当时正在考虑基本上采用这种老式的方式

  1. 根据货币对数据进行排序。
  2. 遍历列表并将数据放入Map(由于数据已排序,直到我得到重复的键,才会开始将相应的数据放入(新主Map中的主帐户)
  3. 基本上在主帐户级别重复上述过程,并开始将重复的键对应的值数据(子帐户放在列表对象中)放入

至于我的思考过程,我必须创建2个列表副本(第一次迭代时在Currency中排序1个),对于嵌套地图,在Primary帐户中创建第二个副本。似乎效率不高,然后我看了看溪流,但看不到我如何使用它们,但是任何指导或想法都将不胜感激。

shm*_*sel 8

使用流非常简单。您最后需要几个嵌套的分组和一个映射。为了简洁起见,我假设您静态导入了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键,因此您实际上可能必须使用虚拟键。