【发布时间】:2017-05-19 09:32:01
【问题描述】:
我有这个代码:
public enum Continent {ASIA, EUROPE}
public class Country {
private String name;
private Continent region;
public Country (String na, Continent reg) {
this.name = na;
this.region = reg;
}
public String getName () {return name;}
public Continent getRegion () {return region;}
@Override
public String toString() {
return "Country [name=" + name + ", region=" + region + "]";
}
}
在主类中:
public static void main(String[] args) throws IOException {
List<Country> couList = Arrays.asList(
new Country ("Japan", Continent.ASIA),
new Country ("Sweden", Continent.EUROPE),
new Country ("Norway", Continent.EUROPE));
Map<Continent, List<String>> regionNames = couList
.stream()
//.peek(System.out::println)
.collect(Collectors.groupingBy(Country::getRegion, Collectors.mapping(Country::getName, Collectors.toList())));
System.out.println(regionNames);
}
如果我运行这段代码,我会得到这个输出:
{EUROPE=[Sweden, Norway], ASIA=[Japan]}
但如果我取消注释 peek 函数,我会得到以下输出:
Country [name=Japan, region=ASIA]
Country [name=Sweden, region=EUROPE]
Country [name=Norway, region=EUROPE]
{ASIA=[Japan], EUROPE=[Sweden, Norway]}
我的问题是,谁能告诉我,当peek 函数到位时,为什么地图regionNames 中的键顺序不同?
【问题讨论】:
-
这确实应该包括一个
hashCode和equals用于Country以确保正确性,但添加它们似乎不会影响问题。 -
是的,我同意
hashcode和equals。 -
我的错,你使用
Continent作为密钥,不需要hashCode和equals。 -
是的 :) 如果我使用
Continent作为键,那么当我需要这些方法时。不过,没关系。它并没有解决这个主要问题。
标签: java lambda java-8 java-stream