SORU
9 Kasım 2010, Salı


Harita Listesi dönüştürmek için Nasıl Java:

Son zamanlarda eğer orada Java Map List dönüştürmek için en iyi yolu ne olacağı hakkında bir meslektaşımla ve bunu yaparken herhangi özel faydalar sohbet var.

Optimum dönüşüm yaklaşımı bilmek istiyorum ve gerçekten eğer herhangi biri bana rehberlik edebilir verirsen memnun olurum.

Bu iyi bir yaklaşım

List<Object[]> results;
Map<Integer, String> resultsMap = new HashMap<Integer, String>();
  for (Object[] o : results) {
    resultsMap.put((Integer) o[0], (String) o[1]);
  }

Teşekkürler.

CEVAP
2 Ocak 2014, PERŞEMBE


ile bir satır ** 25 Collectors sınıfını kullanarak bunu yapmak mümkün olacak.

Map<String, Item> map = list.stream()
                            .collect(Collectors.toMap(Item::getKey,
                                                      item -> item));

Kısa demo :

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class Test{
    public static void main (String [] args){
        List<Item> list = IntStream.rangeClosed(1, 4)
                                   .mapToObj(Item::new)
                                   .collect(Collectors.toList()); //[Item [i=1], Item [i=2], Item [i=3], Item [i=4]]

        Map<String, Item> map = list.stream()
                                    .collect(Collectors.toMap(Item::getKey,
                                                              item -> item));
        map.forEach((k, v) -> System.out.println(k   " => "   v));
    }
}
class Item {

    private int i;

    public Item(int i){
        this.i = i;
    }

    public String getKey(){
        return "Key-" i;
    }

    @Override
    public String toString() {
        return "Item [i="   i   "]";
    }
}

Çıkış :

Key-1 => Item [i=1]
Key-2 => Item [i=2]
Key-3 => Item [i=3]
Key-4 => Item [i=4]

Yorumlarda da belirtildiği gibi, i -> i oldukça açık bulsam da 15 ** yerine Function.identity() kullanabilirsiniz.

Ve tam olmak Eğer fonksiyonu örten ise ikili bir operatör de kullanılabilir olduğunu unutmayın. Mesela bu List düşünün ve eşleme int bir değer için sonucunu modül 3, hesaplama fonksiyonu

List<Integer> intList = Arrays.asList(1, 2, 3, 4, 5, 6);
Map<String, Integer> map = intList.stream()
                                  .collect(toMap(i -> String.valueOf(i % 3), 
                                                 i -> i));

Bu kodu çalıştırırken bir hata java.lang.IllegalStateException: Duplicate key 1 diyerek alırsınız. Bu 1 % 3 4 % 3 olarak aynı ve dolayısıyla anahtar eşleme işlevi, verilen aynı anahtar değerine sahip olmasıdır. Bu durumda bir birleştirme operatörü sağlayabilir.

İşte değerlerin toplamı bu

(i1, i2) -> i1 i2; yöntem referans Integer::sum ile değiştirilebilir.

Map<String, Integer> map = intList.stream()
                                      .collect(toMap(i -> String.valueOf(i % 3), 
                                                     i -> i,
                                                     Integer::sum));

şimdi çıkışları:

0 => 9 (i.e 3   6)
1 => 5 (i.e 1   4)
2 => 7 (i.e 2   5)

Umarım bu yardımcı olur! :)

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • friendz.net

    friendz.net

    29 EKİM 2010
  • George McCarron

    George McCar

    29 Mayıs 2013
  • Virtual Riot

    Virtual Riot

    19 Mayıs 2011