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

  • Joshua Bane

    Joshua Bane

    24 Temmuz 2007
  • Karan Thakur

    Karan Thakur

    23 HAZİRAN 2010
  • SRT Photoshop Tutorials

    SRT Photosho

    19 Aralık 2012