2015-05-14 8 views
23

formatieren Ich habe eine Karte mit Integer Schlüssel und Werte. Ich muss es in ein String mit diesem spezifischen Format umwandeln: key1 - val1, key2 - val2, key3 - val3. Jetzt verwende ich forEach, um jedes Element zu formatieren, sie in einer Liste zu sammeln und dann String.join();Mit Lambda Karte in String

List<String> ships = new ArrayList<>(4); 
for (Map.Entry<Integer, Integer> entry : damagedMap.entrySet()) 
{ 
    ships.add(entry.getKey() + " - " + entry.getValue()); 
} 
result = String.join(",", ships); 

Gibt es einen kürzeren Weg, es zu tun? Und es wäre gut, es mit Lambda zu machen, weil ich etwas Übung mit Lambda brauche.

Antwort

50

Ich glaube, du bist für so etwas suchen:

import java.util.*; 
import java.util.stream.*; 
public class Test { 

    public static void main(String[] args) throws Exception { 
     Map<Integer, String> map = new HashMap<>(); 
     map.put(1, "foo"); 
     map.put(2, "bar"); 
     map.put(3, "baz"); 
     String result = map.entrySet() 
      .stream() 
      .map(entry -> entry.getKey() + " - " + entry.getValue()) 
      .collect(Collectors.joining(", ")); 
     System.out.println(result); 
    } 
} 

Zu den Bits wiederum durchlaufen:

  • entrySet() erhält eine abzählbaren Folge von Einträgen
  • stream() erzeugt einen Strom für das iterable
  • map() konvertiert diesen Strom von Einträgen in einen Strom von Zeichenfolgen der Form "Ke y - Wert "
  • collect(Collectors.joining(", ")) verbindet alle Einträge im Stream zu einer einzigen Zeichenfolge, wobei ", " als Trennzeichen verwendet wird. Collectors.joining ist eine Methode, die eine Collector zurückgibt, die an einer Eingabefolge von Zeichenfolgen arbeiten kann, die das Ergebnis einer einzelnen Zeichenfolge geben.

Beachten Sie, dass die Reihenfolge nicht ist hier garantiert, denn HashMap nicht bestellt wird. Möglicherweise möchten Sie TreeMap verwenden, um die Werte in Schlüsselreihenfolge abzurufen.

+5

oder 'sortiert (Vergleichen (Entry :: getKey)' – assylias

+0

Das war es, danke! Ich wusste nicht, wie man kostenlos lambda-convertion auf die Karte anwenden kann, die einzige Methode, die ich gefunden habe - 'Map.replaceAll' , die den Wert mit dem Typ als Ursprungstyp zurückgeben soll – TEXHIK

+1

@assylias: Ja, guter Punkt –