要映射的Java流

我遇到Map<Integer, List> personenPerLeeftijd ,编译器说方法Persoon :: getLeeftijd无法解析。 我真的不知道我还能做什么,抱歉荷兰语!

我还需要更多信息请问

 public class TestPersoon2 { public static void main(String[] args) { final List personen = Personen.getPersonen(); Map 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> 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 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); } 

正如@ luk2302所提到的,最简单的解决方案是使用Map>

  Map> peopleByAge = personen .stream() .collect(Collectors.groupingBy(Person::getAge)); //THIS METHOD 

如果你真的需要Map>那么还有一些工作要做。

  Map> 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 personen = Personen.getPersonen(); Map 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> peopleByAge = personen .stream() .collect(Collectors.groupingBy(Person::getAge)); //THIS METHOD peopleByAge.forEach((k, v) -> System.out.printf("%2d: %s\n", k, v)); Map> 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 perLeeftijd Map perLeeftijd = personen .stream() .collect(Collectors.groupingBy(Person::getAge, Collectors.counting())); perLeeftijd.forEach((k, v) -> System.out.printf("%2d -> %d\n", k, v)); }