2016-09-07 11 views
1
class Person { 
    private String sex; 
    private List<String> nameList; 

    public Person(String sex, String name) { 
     this.sex = sex; 
     this.nameList = new ArrayList<>(); 
     this.nameList.add(name); 
    } 


    public Person(String sex, List<String> nameList) { 
     this.sex = sex; 
     this.nameList = nameList; 
    } 

} 

public static void main(String[] args) { 
    Person p1 = new Person("M", "name1"); 
    Person p2 = new Person("M", "name2"); 
    Person p3 = new Person("F", "name3"); 
    Person p4 = new Person("F", "name4"); 
    Person p5 = new Person("F", "name5"); 

    List<Person> ps = Arrays.asList(p1, p2, p3, p4, p5); 

    // sex --> Person 
    Map<String, Person> map1 = new HashMap<>(); 
    ps.forEach(p -> { 
     Person pp = map1.get(p.getSex()); 
     if (pp == null) { 
      pp = new Person(p.getSex(), p.getNameList()); 
      map1.put(p.getSex(), pp); 
     } else { 
      pp.getNameList().addAll(p.getNameList()); 
     } 
    }); 
    System.out.println(map1); 

    Map<String, Person> map2 = ps.stream().collect(/* how to write here*/); 
    System.err.println(map2); 
} 

我想用戶ps.stream().collect()解決這個問題像主要()如何使用java8收集這些地圖

謝謝!

回答

0

創建地圖人名的(密鑰)的人(值)

Collectors.toMap(p -> p.getName(), p -> p); 
+0

我想將map2設置爲與map1相同 – xiaoyong

0

我知道答案;

Map<String, Person> map2 = ps.stream() 
      .collect(Collectors.toMap(Person::getSex, p -> p, (oldValue, newValue) -> { 
       oldValue.getNameList().addAll(newValue.getNameList()); 
       return oldValue; 
      }));