当使用Java Lambda(例如Map <key1,map <key2,=“” list <obj =“” >>>)时,如何在group-2中使用group-1结果key1

时间:2019-05-08 11:46:45

标签: java lambda

如何使用Java Lambda在group-2中使用group-1结果。

这个问题是我已经解决的问题的更新: How to covert List to Map<T, <K, List<Person>>> use java lambda?

您可以看到最后的代码。 函数key2要使用函数key1的结果,怎么做?

class Person{
   int age;
   int cityCode;
   String name;
}

method:

// Map<age, Map<cityCode, List<Person>>>
public Map<Integer, Map<Integer, List<Person>>> covertListToMap(List<Person> list){

      // TODO: How to make List<Person> to Map<age, Map<cityCode, List<Person>>>

}



Function<Person, Integer> key1 = (Person p) -> {
            // do many sth then get a key1Result:
            int key1Result = p.getAge() * new Random(10).nextInt();
            return key1Result;
        };


Function<Person, Integer> key2 = (Person p) -> {
            //  Question: how to get and use Function key1 key1Result:

            int key1Result = 0;

            int result = p.getCityCode() + key1Result;
            return result;
        };

Map<Integer, Map<Integer, List<Person>>> collect = list.stream().collect(groupingBy(key1, groupingBy(key2)));

我写了一个错误的示例来显示我的意思:

Map<Integer, Map<Integer, List<Person>>> collect = list.stream().collect(groupingBy((Person p) -> {
            int key1Result = p.getAge() * new Random(10).nextInt();
            return key1Result;  // perhaps, now, key1Result is 10
        }, groupingBy((Person p) -> {

            // now, I want to get the key1Result which is 10, How to do it?  
            int key1Result = 0;

            int result = p.getCityCode() + key1Result;
            return result;
        })));

2 个答案:

答案 0 :(得分:1)

您可以使用功能apply(T t)。根据{{​​3}}:

  

将此函数应用于给定参数。

对于您而言,这意味着:

int key1Result = key1.apply(p)

编辑:在您修改问题时,我添加了一个答案,如果我理解您想做的事,那应该是正确的:

AtomicInteger atomicInteger = new AtomicInteger(0);
Map<Integer, Map<Integer, List<Person>>> collect = personList.stream().collect(Collectors
        .groupingBy(p -> {
                int age = p.getAge() * new Random(10).nextInt();
                atomicInteger.set(age);
                return age;
            }, Collectors.groupingBy(p2 -> p2.getCityCode() + atomicInteger.get())));

如果您想了解有关AtomicInteger的更多信息,请参见https://docs.sencha.com/extjs/6.7.0/modern/Ext.tab.Panel.html#event-initialize。基本上,它是一个包装器,它将在线程之间保留其变量。

答案 1 :(得分:1)

首先使用修改后的密钥收集所需的地图

Map<Integer, Map<Integer, List<Person>>> collect2 = personList.stream().collect(Collectors
        .groupingBy(p -> p.getAge() * new Random(10).nextInt(),
                Collectors.groupingBy(Person::getCityCode)));

然后更改地图。在这种情况下,问题是您正在使用嵌套地图。然后,您要使用外部地图的key change the key of inner Map。因此,除了为每个外部Key创建新的内部Map之外,别无他法。

这里,我要遍历外部地图的每个条目,并使用已经存在的内部地图创建一个新的适当的(必需的)内部地图。

collect2.entrySet().stream().forEach(e -> {
    Integer key = e.getKey();
    Map<Integer, List<Person>> oldValueMap = e.getValue();
    Map<Integer, List<Person>> newValueMap = new HashMap<>();
    oldValueMap.keySet().forEach(k -> {
        newValueMap.put(k + key, oldValueMap.get(k));
    });
    e.setValue(newValueMap);
});