我有一个List<Coordinates> coordinateList = new ArrayList<Coordinates>();
,其中包含与值Coordinates
,X
和Y
相关的对象(name
)。
例如
Coordinates [X=0.1, Y=0.1, name=Series1]
Coordinates [X=0.1, Y=0.2, name=Series1]
Coordinates [X=0.1, Y=0.3, name=Series1]
Coordinates [X=0.1, Y=0.4, name=Series2]
Coordinates [X=0.1, Y=0.5, name=Series2]
等
我要实现的目的是创建一个按名称分组的所有Coordinates
的Map。这是通过以下Java 8操作完成的:
Map<String, List<Coordinates>> newList = coordinateList.stream()
.collect(Collectors.groupingBy(Coordinates::getName));
输出:
{Series1=[Coordinates [X=0.1, Y=0.1, name=Series1], Coordinates [X=0.1, Y=0.2, name=Series1], Coordinates [X=0.1, Y=0.3, name=Series1]], Series2=[Coordinates [X=0.1, Y=0.4, name=Series2], Coordinates [X=0.1, Y=0.5, name=Series2]]}
是否有办法删除name
包含的List
中的Map
?我可以通过与对象toString
关联的Coordinates
方法将其删除,但是在分组时需要它。
我要实现的示例:
Series1=[Coordinates [X=0.1, Y=0.1], Coordinates [X=0.1, Y=0.2]
等
答案 0 :(得分:3)
根据您的代码,您正在使用Coordinates.getName()方法进行分组。在此实现中,不调用Coordinates的toString()方法。
Map<String, List<Coordinates>> newList = coordinateList.stream()
.collect(Collectors.groupingBy(Coordinates::getName));
可以安全地覆盖Coordinates类的toString方法,并从字符串中删除“名称”字段。
public String toString() {
return "Coordinates: [X=" + X + " ,Y=" + Y + "]";
}
答案 1 :(得分:2)
由于使用Coordinates::getName
进行了分组,因此name
方法中的toString()
属性是不需要的(按照惯例,您可以删除它),那么您将拥有想要的输出
@Override
public String toString() {
return "Coordinates [X=" + x + ", Y=" + y + "]";
}