Java 根据填充的属性对对象列表进行分组
我有一个有10个属性的类。我想根据是否填充属性对该类的对象列表进行分组。确切地说,我将得到2^n个组。我可以迭代列表并写入2^n个条件,然后将它们分组到新列表中。有没有其他更好的方法来实现此功能,而不是编写这些切换条件?您可以避免编写多个Java 根据填充的属性对对象列表进行分组,java,collections,Java,Collections,我有一个有10个属性的类。我想根据是否填充属性对该类的对象列表进行分组。确切地说,我将得到2^n个组。我可以迭代列表并写入2^n个条件,然后将它们分组到新列表中。有没有其他更好的方法来实现此功能,而不是编写这些切换条件?您可以避免编写多个switch语句,并且在类本身中有一个标识符/键,这有助于了解是否设置了某些属性 例如: DemoClass(3个属性用于简化) 可以通过各种方式填充上述字段,例如重载构造函数或setter方法 现在,当您想要分成多个组时,您可以使用HashMap并根据其键的值
switch
语句,并且在类本身中有一个标识符/键,这有助于了解是否设置了某些属性
例如:
DemoClass(3个属性用于简化)
可以通过各种方式填充上述字段,例如重载构造函数
或setter
方法
现在,当您想要分成多个组时,您可以使用HashMap并根据其键的值将类的对象添加到列表中,如下所示
Map<String, List<DemoClass>> map = new HashMap<>();
for (DemoClass demoClass : demoClasses) {
map.computeIfAbsent(demoClass.getKey(), k -> new ArrayList<>()).add(demoClass);
}
Map Map=newhashmap();
用于(DemoClass DemoClass:DemoClass){
map.computeIfAbsent(demoClass.getKey(),k->new ArrayList()).add(demoClass);
}
您可以避免编写多个switch
语句,并且在类本身中有一个标识符/键,这有助于理解是否设置了某些属性
例如:
DemoClass(3个属性用于简化)
可以通过各种方式填充上述字段,例如重载构造函数
或setter
方法
现在,当您想要分成多个组时,您可以使用HashMap并根据其键的值将类的对象添加到列表中,如下所示
Map<String, List<DemoClass>> map = new HashMap<>();
for (DemoClass demoClass : demoClasses) {
map.computeIfAbsent(demoClass.getKey(), k -> new ArrayList<>()).add(demoClass);
}
Map Map=newhashmap();
用于(DemoClass DemoClass:DemoClass){
map.computeIfAbsent(demoClass.getKey(),k->new ArrayList()).add(demoClass);
}
我最终得到了字符串中记录属性的一个位值(每个属性的1和0(1表示值存在,0表示它不存在))并按字符串进行分组
records.stream().map(record -> new ExportDto.Builder().buildUpon(record).bitValue(getBitValueOfExportRecord(record)).build())
.collect(Collectors.groupingBy(ExportDto::getBitValue))
最后,我得到了字符串中记录属性的一个位值(每个属性的1和0(1表示值存在,0表示它不存在))并按字符串对它们进行分组
records.stream().map(record -> new ExportDto.Builder().buildUpon(record).bitValue(getBitValueOfExportRecord(record)).build())
.collect(Collectors.groupingBy(ExportDto::getBitValue))
十个二进制值不会导致1024个排列吗?您可以将其收集为位(每个字段都有自己的位),可以直接用作分组索引。十个二进制值不会导致1024个排列吗?您可以将其收集为位(每个字段都有自己的位),这可以直接用作分组索引。这主意不错,但我认为您需要将每个
demoClass
添加到值中:map.put(demoClass.getKey(),demoClass.getOrDefault(demoClass.getKey(),new ArrayList())
。还有,为什么不使用a作为键呢。我们不能使用demoClass
,因为它是demoClass
的一个实例,而不是HashMap
的一个实例。另外computeIfAbsent
是Java提供的一个很好的API,与使用getOrDefault
相比,它使代码更容易理解,这是非常有用的如果值不是集合
也可以使用位集
,但我觉得上面的解决方案是使用一个字符串键,它提供关于集合属性的信息,可读性更高,并且可以进一步扩展到诸如找出填充了哪些属性的用例。这主意不错,但我认为不是computeIfAb已发送
,您需要将每个demoClass
添加到值:map.put(demoClass.getKey(),demoClass.getOrDefault(demoClass.getKey(),new ArrayList())
。还有,为什么不使用a作为键呢。我们不能使用demoClass
,因为它是demoClass
的一个实例,而不是HashMap
的一个实例。另外computeIfAbsent
是Java提供的一个很好的API,与使用getOrDefault
相比,它使代码更容易理解,这是非常有用的如果值不是集合
也可以使用位集
,但我觉得上面的解决方案是使用一个字符串键来提供关于集合属性的信息,它更具可读性,并且可以进一步扩展到用例中,例如找出填充了哪些属性。