2016-09-07 3 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; 
      }));