2016-04-11 18 views
14

Animal nesnesinin Arraylist olduğunu varsayalım.Listede yer alan nesnelerin özelliklerini ayarlama 8

Yapmak istediğim ne
class Animal{ 
    String Name;//for example "Dog" 
    String Color 
} 

, farklı renk ArrayList her hayvan için var kaç saymak ve String İsim ve Integer için bir Map<String,Integer> koydu şöyledir: Nesnenin O sınıf böyledir farklı renklerin sayısı. Örneğin

Ben Stream kullanılarak yapılabilir ama nasıl bulamıyor biliyorum

map.put("Dog",2); 

olurdu 4 siyah köpek ve 1 beyaz haritasına eşdeğer koymak varsa.

cevap

19

Ne yapmak istediğiniz grouping operation adı özelliğini anahtar olarak kullanarak kullanmaktır. Bu kolay kısım. Trickier, alt koleksiyoncu olarak “farklı renklerin sayısını” ifade etmektir. JRE'de böyle bir toplayıcı olmadığı için, bir Set depolama birimi kullanarak bir tane inşa etmeliyiz. Yerleşik biri olsa bile, kaputun altında benzer bir depolama alanı kullanmak zorunda olduğunu unutmayın. renklerine yüzden map the elements, boyut sorgulayarak ve finish (ayrı yalnızca değerleri tutmak ima) collect them into Sets:

Map<String, Integer> map = animalStream.collect(
    Collectors.groupingBy(Animal::getName, 
     Collectors.collectingAndThen(
      Collectors.mapping(Animal::getColor, Collectors.toSet()), 
      Set::size))); 
5

Bu çalışması gerekir:

İşte
Map<String, Integer> map = animal.stream().collect(
      Collectors.groupingBy(
        Animal::getName, 
        Collectors.collectingAndThen(
          Collectors.mapping(Animal::getColor, Collectors.toSet()), 
          Set::size) 
        ) 
      ); 

bazı test kodu:

public static void main(String[] args) { 
    List<Animal> animal = new ArrayList<>(); 
    animal.add(new Animal("Dog","black")); 
    animal.add(new Animal("Dog","black")); 
    animal.add(new Animal("Dog","blue")); 
    animal.add(new Animal("Cat","blue")); 
    animal.add(new Animal("Cat","white")); 

    Map<String, Integer> map = animal.stream().collect(
      Collectors.groupingBy(
        Animal::getName, 
        Collectors.collectingAndThen(
          Collectors.mapping(Animal::getColor, Collectors.toSet()), 
          Set::size) 
        ) 
      ); 

    for(Entry<String, Integer> entry:map.entrySet()) { 
     System.out.println(entry.getKey()+ " : "+entry.getValue()); 
    } 

} 

Cat : 2 
Dog : 2 

Not: Bu sorunun cevabı bu SO sonrası esinlenerek: İsterseniz https://stackoverflow.com/a/30282943/1138523 Yapabilirsin

+0

, test kodu için Harita :: forEach kullanın: map.forEach ((anahtar, değer) -> System.out. println (tuş + ":" + değer)); – srborlongan

+2

Teşekkürler, bilmiyordum –

İlgili konular