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

  • BeginnersTech

    BeginnersTec

    8 NİSAN 2011
  • Easy Learn Tutorial

    Easy Learn T

    10 Kasım 2012
  • ItZWaffleS420

    ItZWaffleS42

    9 EYLÜL 2011