2017-11-16 1 views
3

Ich habe eine Map<String,ExtractedData> extractedDatas und ich möchte einige Daten als Ergebnis zurückgeben. Ich bin ziemlich neu in der Stream-API und ich verstehe nicht, was ich zu tun habe. Ich habe versucht, mitJava 8 Stream-Extrakt-Daten von Karte

public Map<String,ExtractedData> getExtractedData(String name) 
{ 
    return extractedDatas.entrySet().stream() 
      .filter(entry -> entry.getKey().startsWith(name)) 
      .filter(entry -> entry.getValue().getFieldValue() != null && entry.getValue().getFieldValue() != "") 
      .collect(Collectors.toMap(...); 
} 

Was muss ich in der Collectors.toMap setzen?

Antwort

7

Sie müssen einfach die Funktionen übergeben, die ein Element Ihres Stream auf den Schlüssel und den Wert des Ausgangs Map abbilden.

In Ihrem Fall ist es einfach der Schlüssel und der Wert der Map.Entry Elemente des Streams.

public Map<String,ExtractedData> getExtractedData(String name) 
{ 
    return extractedDatas.entrySet().stream() 
      .filter(entry -> entry.getKey().startsWith(name)) 
      .filter(entry -> entry.getValue().getFieldValue() != null && entry.getValue().getFieldValue() != "") 
      .collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue)); 
} 
+0

Dank. Ich habe versucht mit '.collect (Collectors.toMap (entry -> entry.getKey(), entry -> entry.getValue()));' aber in der Eclipse, wenn ich 'entry.' schreibe, habe ich nicht die 'getKey()' noch 'getValue()', auch wenn der Code funktioniert. – tweetysat

+0

Was ist der Unterschied zwischen 'Map.Entry :: getKey, Map.Entry :: getValue'und' entry -> entry.getKey(), entry -> entry.getValue() '? Beide arbeiten. – tweetysat

+1

@tweetysat Beide sind gültige Möglichkeiten, um die Implementierung einer funktionalen Schnittstelle auszudrücken. Die erste ist eine Methodenreferenz und die zweite ist ein Lambda-Ausdruck. – Eran

1

Sie tun können, es ist ein bisschen anders, wenn Sie OK sind die Änderung der ursprünglichen Map:

extractedDatas 
    .entrySet() 
    .removeIf(entry -> 
       !(entry.getKey().startsWith(name) || 
        entry.getValue().getFieldValue() != null && entry.getValue().getFieldValue() != "") 
       ) 
      ); 
+0

Danke, aber das ist nicht der Fall. – tweetysat