如何使用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;
})));
答案 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);
});