当前位置: 首页 > 知识库问答 >
问题:

当使用Java Lambda like Map时,如何在group-2中使用group-1结果key1

贺子昂
2023-03-14

如何通过JavaLambda在group-2中使用group-1结果。

这个问题是从我的更新一个解决的问题:如何将列表转换为映射

你可以看到最后一个代码。功能键2要使用功能键1的结果,怎么办?

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个答案

高弘光
2023-03-14

第一步,你用修改后的钥匙收集所需的地图

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

然后更改映射。您这种情况下的问题是您使用的是嵌套映射。并且使用外部Map的key您想要更改内部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);
});
谷森
2023-03-14

您可以使用函数 apply(T t)。根据javadoc:

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

对你来说,这意味着:

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())));

如果您想了解有关< code>AtomicInteger的更多信息,请参见atomic。基本上,它是一个在线程间保持变量的包装器。

 类似资料:
  • 问题内容: T_TABLE2 的结构是 我在firebird中使用SQL编辑器测试了我的查询。查询是 但我在分组时遇到了这个错误。 问题答案: 您必须来自MySQL。MySQL-IMHO令人误解,错误且以一种黑变的,不可预测的方式-允许您指定部分查询,而数据库引擎会尝试从其余查询中找出您未分组的列中的 哪个 值想。另一方面,标准SQL(Firebird和大多数其他RDBMS)则不这样做。它要求将任

  • 本文向大家介绍如何在PowerShell中使用Group-Object cmdlet?,包括了如何在PowerShell中使用Group-Object cmdlet?的使用技巧和注意事项,需要的朋友参考一下 顾名思义,Group-Object可用于对相似的属性进行分组。 示例 输出结果 上面的输出按状态分组(“已停止”和“正在运行”)。共有160个服务处于“已停止”状态,而130个处于“运行”状态

  • 问题内容: 我想加入三个表并计算表A的总和(数量)。我尝试了一些操作,然后得到了所需的输出。但是我仍然对基于聚合函数和Group By子句感到困惑。 通过连接两个或多个表来计算总和值时,我们需要在Group By子句中提及哪些列,为什么我们需要提供这些列? 例如:这是我的表和所需的查询。 我想根据获得的总和(数量),,和。 我写了以下查询,它工作正常。但是,如果我删除Group By子句中的任何列

  • 问题内容: 我有一张要导出到CSV数据的表。理想情况下,我想在行和列之间进行切换,以使数据分组更好。 为了进一步解释,当前,数据库看起来像这样。 我想按data_timestamp值对data_value进行分组,以便对时间戳进行分组,并且每个data_id的每个data_value都显示在列中,而不是行中。 以下是我正在使用的查询… 但这不是我想要的,因为只要一个data_id没有值,现在就有N

  • 本文向大家介绍如何在C#中使用order by,group by?,包括了如何在C#中使用order by,group by?的使用技巧和注意事项,需要的朋友参考一下 订购用于按升序或降序对数组进行排序 GroupBy运算符属于“分组运算符”类别。该运算符采用扁平的项目序列,根据特定键将该序列组织为组(IGrouping <K,V>),并返回序列组 示例 输出结果 订购依据 输出结果

  • 本文向大家介绍SQL 使用HAVING子句过滤GROUP BY结果,包括了SQL 使用HAVING子句过滤GROUP BY结果的使用技巧和注意事项,需要的朋友参考一下 示例 HAVING子句过滤GROUP BY表达式的结果。注意:以下示例使用的是Library示例数据库。 例子: 返回写了不止一本书的所有作者(在线示例)。 返回作者超过三名的所有书籍(实时示例)。