要映射的Java流

时间:2015-12-24 13:05:50

标签: java dictionary lambda java-8 java-stream

我遇到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);
}

1 个答案:

答案 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));
}