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

使用Java 8动态创建具有复合密钥的地图

锺离晗昱
2023-03-14

我想创建一个像下面这样的地图-

Map<Pair<MyClass.a, MyClass.b>, MyClass>>.

我有一张物品清单-

List<MyClass>

这里Pair是一个类,已经在我的项目中,所以我想使用它。

我需要帮助从Java8流创建它。

我试过了:

ls.stream().collect(Collectors.toMap(new Pair(MyClass.a, MyClass.b), MyClass));

但我犯了个错误。我刚刚接触Java 8,正在努力学习它。

添加一个示例:

class Person {
   String name ;
   int age ;
   // Some other variables
}

我有一个列表

在我的需求中,我需要一个key={name,age},使用pair类。

class Pair<T,U> {     
    Pair(T t, U u) {
        this.t = t
        this.u = u
    }

    // Overridden hashCode && equals methods
}

现在我想创建一个类似map的地图

我收到一个编译器错误,上面写着“不是函数接口”。

我相信一定有办法通过Java8流和收集。


共有1个答案

顾昊穹
2023-03-14

为了创建函数,必须使用lambda表达式。仅仅编写一个像new Pair(MyClass.a,MyClass.b)这样的表达式是不够的,相反,您可以指定一个带有参数的函数,它将是一个Person实例,即p-

对于Map创建操作,您必须决定想要什么。例如。,

Map<Pair<String, Integer>, List<Person>> map
    = list.stream().collect(Collectors.groupingBy(p -> new Pair<>(p.name, p.age)));

将每个键映射到具有该名称/年龄组合的所有Person实例的列表。

对比之下

Map<Pair<String, Integer>, Person> map
    = list.stream().collect(Collectors.toMap(p -> new Pair<>(p.name, p.age), p -> p));

将名称/年龄对映射到单个Person实例,但如果有多个实例具有相同的键,则会引发异常。您可以指定一个函数来解决此类冲突,例如:

Map<Pair<String, Integer>, Person> map = list.stream().collect(
    Collectors.toMap(p -> new Pair<>(p.name, p.age), p -> p, (first, next) -> first));

将保持第一,而

Map<Pair<String, Integer>, Person> map = list.stream().collect(
    Collectors.toMap(p -> new Pair<>(p.name, p.age), p -> p, (prev, last) -> last));

将覆盖上一次发生的事件,并以每个姓名/年龄组合的最后一个Person实例结束。

 类似资料:
  • 在Azure密钥库策略中,我想添加ADF。下面给出了命令(从管道执行)。但在创建后,它显示为“代表”文本的“复合身份”,它不起作用。当我手动将ADF添加到策略中时,它显示为'application',并且它可以工作。如何使powershell创建“应用程序”标识? 完整脚本

  • 在我的项目中,有一个模型与另一个模型有关系(基数=“许多”):单位有许多组织。这种关系运行得很好! 因此,我试图(但没有成功)提出以下建议: 我得到了一个错误: 我必须这样做,因为在不止一个站点中有相同代码的组织,所以我会这样做,只是改变站点的uid默认值。 你知道我可以用另一种方法来表达这个观点吗?或者我在那个例子中犯了什么错误? 谢谢!

  • 假设我想要一个复合键作为采购订单实体的street,city。 下面是我如何识别做这件事, 我想明白@AttributeOverrides注释到底是做什么的?即使我将colomn name更改为something STREET1,我仍然看到使用列名street创建的表。那么column=@column(name=“street”))在这里做什么。 另外,我可以将它作为PurchaseOrder类的

  • 根据给定的私钥生成密钥对,并在保存后返回其ID。 调用: web3.shh.addPrivateKey(privateKey, [callback]) 参数: privateKey:String - 要导入的私钥,16进制字符串 callback:Function - 可选的回调函数,其第一个参数为错误对象,第二个对象为返回结果 返回值: String - 成功时返回ID,失败则返回错误信息 示

  • 问题内容: 我刚刚开始使用MongoDb,我注意到我有很多重复的记录,这些记录本来就是唯一的。我想知道如何对数据使用组合键,并且正在寻找有关如何创建它们的信息。最后,我使用Java来访问mongo和morphia作为我的ORM层,因此将您的答案中的内容包括在内是非常棒的。 Morphia:http : //code.google.com/p/morphia/ 问题答案: 您也可以将对象用于_id字