我遇到Map<Integer, List<String>> personenPerLeeftijd
的问题,编译器说方法Persoon :: getLeeftijd无法解析。我真的不知道我还能做什么,抱歉荷兰语!
我还需要更多信息请问
public class TestPersoon2 {
public static void main(String[] args) {
final List<Persoon> personen = Personen.getPersonen();
Map<String, Persoon> map =
personen.stream().collect(Collectors.toMap(p -> p.getNaam() + "-" + p.getLeeftijd(), p -> p));
for (String s : map.keySet()) {
System.out.printf("%-15s -> %s\n", s, map.get(s));
}
Map<Integer, List<String>> personenPerLeeftijd =
personen.stream().collect(Collectors.groupingBy(Persoon::getLeeftijd)); //THIS METHOD
personenPerLeeftijd.forEach((k, v) -> System.out.printf("%2d: %s\n", k,
v.stream()
System.out.println();
TreeMap<Integer, Long> perLeeftijd =
personen.stream().collect(Collectors.groupingBy(Persoon::getLeeftijd, Collectors.counting()));
perLeeftijd.forEach((k, v) -> System.out.printf("%2d -> %d\n", k, v));
}
Persoon课程
public class Persoon {
private final String naam;
private final Geslacht geslacht;
private final int leeftijd;
public Persoon(String naam, Geslacht geslacht, int leeftijd) {
this.naam = naam;
this.geslacht = geslacht;
this.leeftijd = leeftijd;
}
public String getNaam() {
return naam;
}
public Geslacht getGeslacht() {
return geslacht;
}
public int getLeeftijd() {
return leeftijd;
}
public int leeftijdsverschil(final Persoon andere) {
return leeftijd - andere.leeftijd;
}
@Override
public String toString() {
return String.format("%-9s - %s - %2d", naam, geslacht, leeftijd);
}
答案 0 :(得分:2)
如@ luk2302所述,最简单的解决方案是使用Map<Integer, List<Person>>
。
Map<Integer, List<Person>> peopleByAge = personen
.stream()
.collect(Collectors.groupingBy(Person::getAge)); //THIS METHOD
如果你真的需要Map<Integer, List<String>>
那么还有一些事情要做。
Map<Integer, List<String>> peoplesNamesByAge = personen
.stream()
.collect(
Collectors.groupingBy(Person::getAge,
Collectors.mapping(Person::getName,
Collectors.toList())));
peoplesNamesByAge.forEach((k, v) -> System.out.printf("%2d: %s\n", k, v));
这就是整个事情 - 我为了自己的理智而对它进行了一些改进。 :)
enum Gender {
Male, Female;
}
public class Person {
private final String name;
private final Gender gender;
private final int age;
public Person(String naam, Gender gender, int age) {
this.name = naam;
this.gender = gender;
this.age = age;
}
public String getName() {
return name;
}
public Gender getGender() {
return gender;
}
public int getAge() {
return age;
}
public int getAgeDifference(final Person other) {
return age - other.age;
}
@Override
public String toString() {
return String.format("%-9s - %s - %2d", name, gender, age);
}
}
public void test() {
final List<Person> personen = Personen.getPersonen();
Map<String, Person> map
= personen.stream().collect(Collectors.toMap(p -> p.getName() + "-" + p.getAge(), p -> p));
for (String s : map.keySet()) {
System.out.printf("%-15s -> %s\n", s, map.get(s));
}
Map<Integer, List<Person>> peopleByAge = personen
.stream()
.collect(Collectors.groupingBy(Person::getAge)); //THIS METHOD
peopleByAge.forEach((k, v) -> System.out.printf("%2d: %s\n", k, v));
Map<Integer, List<String>> peoplesNamesByAge = personen
.stream()
.collect(
Collectors.groupingBy(Person::getAge,
Collectors.mapping(Person::getName,
Collectors.toList())));
peoplesNamesByAge.forEach((k, v) -> System.out.printf("%2d: %s\n", k, v));
System.out.println();
// TreeMap<Integer, Long> perLeeftijd
Map<Integer, Long> perLeeftijd = personen
.stream()
.collect(Collectors.groupingBy(Person::getAge, Collectors.counting()));
perLeeftijd.forEach((k, v) -> System.out.printf("%2d -> %d\n", k, v));
}