2017-10-13 61 views
5

için birden diziler azaltın ve bunu yaparak Java8 yeni lambdas ile List<String> bir List<Map<String, Object>> azaltmak:Ben filtrelemek çalışıyorum listesi

List<Map<String, Object>> myObjects = new ArrayList<>(); 
myObjects.stream() 
    .filter(myObject-> myObject.get("some integer value").equals(expectedValue)) 
    // myObject.get("some attribute") == ["some string", "maybe another string"] 
    .map(myObject-> myObject.get("some attribute")) 
    .collect(Collectors.toList()); 

sonucu Liste ama içindeki tüm Dizeler birleştirmek istiyorum oluşan sonuç için List<String>.

olayı aydınlatmak için, bu şimdi alıyorum sonucudur:

ArrayList{["some string"], ["another string"]} 

Ama bunu istiyorum:

ArrayList{"some string", "another string"} 

birisi bana azaltmak zorunda hangi bölümüne bir ipucu verebilir String[], String için? .map() parçasında olduğunu tahmin ediyorum ama orada ne değişeceğimi bilmiyorum.

düzenleme:List<Map<String, Object>> myObjects test amaçlıdır oluşturulabilir nasıl

:

List<Map<String, Object>> myObjects = new ArrayList<>(); 
Map<String, Object> myObject = new HashMap<>(); 
myObject.put("some integer value", 1); 
String[] theStringIWant = new String[1]; 
theStringIWant[0] = "Some important information I want"; 
myObject.put("some attribute", theStringIWant); 
myObjects.add(myObject); 

şuna benzer:

List<MyObject{"some attribute": 1}> 

Not: Bu sadece bir örnek benim uysallığımdan. Listede normalde birden fazla öğe bulunur ve her haritanın yalnızca some attribute değil, daha fazla özelliği vardır.

+3

Zor, ama muhtemelen need .flatmap (myObject-> ((List) myObject.get ("liste")). stream()) ' –

+1

Bana birkaç dakika verirseniz, gerçek listeyle daha iyi bir örnek sağlayabilirim. :) – Peter

+0

Bunu denerseniz, bir "java.lang.ClassCastException" alıyorum: [Ljava.lang.String; java.util.List ' – Peter

cevap

4

Başka filtreyi olması gerekebilir, ancak bu başaracağım nasıl:

public static void main(String[] args) { 
    List<Map<String, Object>> myObjects = new ArrayList<>(); 
    Map<String, Object> myObject1 = new HashMap<>(); 

    myObject1.put("some attribute", 1); 
    myObject1.put("some string", new String[] { "Some important information I want"}); 
    myObjects.add(myObject1); 

    Map<String, Object> myObject2 = new HashMap<>(); 
    myObject2.put("some attribute", 1); 
    myObject2.put("some string", new String[] { "hello", "world" }); 
    myObjects.add(myObject2); 

    Map<String, Object> myObject3 = new HashMap<>(); 
    myObject3.put("some attribute", 2); 
    myObject3.put("some string", new String[] { "don't", "want", "this"}); 
    myObjects.add(myObject3); 

    Map<String, Object> myObject4 = new HashMap<>(); 
    myObject4.put("some string", new String[] { "this", "one", "does", "not", "have", "some attribute"}); 
    myObjects.add(myObject4); 

    List<String> list = myObjects.stream() 
      .filter(map -> map.containsKey("some attribute")) 
      .filter(map -> map.get("some attribute").equals(Integer.valueOf(1))) 
      .flatMap(map -> Arrays.stream((String[])map.get("some string"))) 
      .collect(Collectors.toList()); 

     System.out.println(list); 
    } 

sonuç sizin `orijinal Map` görmeden söylemek [Some important information I want, hello, world]

3

Sen map yöntemin yerine String[] bir Stream dönen flatMap yöntemi ile bu elde etmek mümkün olmalıdır:

myObjects.stream() 
    .filter(myObject-> myObject.get("some integer value").equals(expectedValue)) 
    .flatMap(myObject-> Arrays.stream((String[])map.get("some attribute"))) 
    .collect(Collectors.toList()); 

Ama farkında olmak Arrays.stream((String[])map.get("some attribute")) bir Exception atarsa, mesela o map.get("some attribute"), String[] değilse, Akış tarafından yutulur.

+0

Ne yazık ki senin sürümün de bana 'listesini getiriyor. M. le Rutte'nin cevabı benim için çalışıyor. Ama içine koyduğunuz tüm çabalar için teşekkürler (çünkü örnek kodumda birkaç hata yaptım). – Peter

+0

Haklısınız, "Stream.of" sadece "String" ile "String" i döndürerek tek bir öğe olarak döndürür. Cevabı güncelledim. – user1983983

İlgili konular