2017-07-08 3 views
3

Ich habe einen List von String (s), aber ich will es in eine von der List<String>Map<String, Boolean> konvertieren, werden alle in gesetzt boolean Zuordnungen machen wahr. Ich habe den folgenden Code.erstellen Karte aus einer Liste von String (s) mit Strömen

import java.lang.*; 
import java.util.*; 
class Main { 
    public static void main(String[] args) { 
    List<String> list = new ArrayList<>(); 
    list.add("ab"); 
    list.add("bc"); 
    list.add("cd"); 
    Map<String, Boolean> alphaToBoolMap = new HashMap<>(); 
    for (String item: list) { 
     alphaToBoolMap.put(item, true); 
    } 
    //System.out.println(list); [ab, bc, cd] 
    //System.out.println(alphaToBoolMap); {ab=true, bc=true, cd=true} 
    } 
} 

Gibt es eine Möglichkeit, diese mit Streams zu reduzieren?

+0

Warum würden Sie das brauchen? – shmosel

Antwort

5

Ja. Sie können auch Arrays.asList(T...) verwenden, um Ihre List zu erstellen. Dann mit einem Stream zu collect diese mit Boolean.TRUE wie

List<String> list = Arrays.asList("ab", "bc", "cd"); 
Map<String, Boolean> alphaToBoolMap = list.stream() 
     .collect(Collectors.toMap(Function.identity(), (a) -> Boolean.TRUE)); 
System.out.println(alphaToBoolMap); 

Ausgänge

{cd=true, bc=true, ab=true} 

Aus Gründen der Vollständigkeit, sollten wir auch ein Beispiel betrachten, wo einige Werte false sein sollte. Vielleicht ein leerer Schlüssel wie

List<String> list = Arrays.asList("ab", "bc", "cd", ""); 

Map<String, Boolean> alphaToBoolMap = list.stream().collect(Collectors // 
     .toMap(Function.identity(), (a) -> { 
      return !(a == null || a.isEmpty()); 
     })); 
System.out.println(alphaToBoolMap); 

Welche

{=false, cd=true, bc=true, ab=true} 
+0

Super !! danke –

3

Der kürzeste Weg gibt ich denken kann, ist kein Einzeiler, aber es ist in der Tat kurz:

Map<String, Boolean> map = new HashMap<>(); 
list.forEach(k -> map.put(k, true)); 

Diese persönliche ist Geschmack, aber ich benutze nur Streams, wenn ich Transformationen auf die Quelle anwenden oder einige Elemente herausfiltern muss.


Wie in den Kommentaren von @ holi-java oft vorgeschlagen, ist die Verwendung eines Map mit Werte sinnlos, da es nur zwei mögliche Werte gibt, denen Schlüssel zugeordnet werden können. Stattdessen könnte ein Set verwendet werden, um fast alle die gleichen Probleme zu lösen, die Sie mit einem Map<T, Boolean> lösen würden.

+0

up-vote, zuerst. Ich denke, Sie sollten der OP vorschlagen, ein 'Set' anstatt eine' Map' zu sammeln. dann ist das Problem sehr einfach, :). 'Stream.of (...). Collect (toSet())' oder 'new HashSet (Arrays.asList (...))' weil 'Boolean' in diesem Fall nur 2 Werte hat. –

+0

@ holi-java Hallo! Warum ein 'Set'? OP möchte eine Map mit der Liste als Schlüssel und 'true' immer als Wert. –

+0

, weil die Verwendung von 'Map' mit einem' Boole'-Wert bedeutungslos ist. fast alle Operationen die 'Set ' kann. wenn er nur das 'foo = true'-Format drucken möchte, verwenden Sie einfach eine' map (it-> "$ it = true") Operation. –

0

Wenn Sie eine vorhandene Map<..., Boolean> mutieren möchten, können Sie Collections.newSetFromMap verwenden. Damit können Sie eine solche Karte als Set behandeln:

Collections.newSetFromMap(alphaToBoolMap).addAll(list); 
+0

* Die angegebene Map muss zum Zeitpunkt des Aufrufs dieser Methode leer sein und sollte nicht direkt aufgerufen werden, nachdem diese Methode zurückgegeben wurde. * – shmosel

Verwandte Themen