2016-05-13 10 views
3

Ich habe den folgenden Code.Java 8 Strom api Steuerausgang

List<String> parseAttribValueByTag(String tag, String attrib, List<String> attribName) throws IOException { 

    List<String> keys = new ArrayList<>(); 

    Document doc = Jsoup.connect(url).get(); 
    Elements inputs = doc.select(tag + "[" + attrib + "]"); 
    for (String item : attribName) { 
     System.out.println(inputs.stream() 
      .filter(input -> input.attr("name").contains("__VIEWSTATE")) 
      .findFirst()); 
    } 
return keys; 
} 

Es gibt mir die folgende Ausgabe

Optional[<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="5ue/NxnSLQ2akzQo5R8wBEZ,,."

ich die Ausgabe steuern möchte, damit es mir nur __VIEWSTATE "5ue/NxnSLQ2akzQo5R8wBEZ,,."

gibt Ich habe versucht mit .map(input -> input.attr("value")) und es gibt mir Optional[5ue/NxnSLQ2akzQo5R8wBEZ,,.

aber wenn ich eine zusätzliche .map(input -> input.attr("name")) hinzufügen, um auch giv e mir der Name Ich bekomme den folgenden Fehler "Kann Methode nicht auflösen 'attr (java.lang.String)'". Was mache ich falsch im Code? Gibt es einen Weg dahin?

Antwort

2

Wenn Sie ein .map(input -> input.attr("value")) hinzufügen, konvertieren Sie Ihre Stream zu einem Stream<String> (unter der Annahme, dass attr ein String zurückgibt), und String haben keine attr Methode, so dass der zweite map Anruf nicht passieren Kompilation (daher die Kompilierung Fehler - Cannot resolve method 'attr(java.lang.String)').

Sie könnten eine einzelne Operation map verwenden, um beide Attribute zu erhalten. Zum Beispiel:

System.out.println(inputs.stream() 
     .filter(input -> input.attr("name").contains("__VIEWSTATE")) 
     .map(input -> input.attr("name") + " " + input.attr("value")) 
     .findFirst()); 
+0

Dank @Eran. Das funktioniert. Die Ausgabe, die ich jetzt bekomme, ist 'Optional [__ VIEWSTATE fmxGAU4TK1P1'. Gibt es eine Möglichkeit, das 'Optional [' in der Ausgabe loszuwerden? – g3blv

+3

@ user148095: Anstatt 'System.out.println (... .findFirst())' '' .findFirst(). IfPresent (System.out :: println) 'zu verwenden, um den Inhalt des' Optional' zu drucken, falls da ist einer. Oder verwenden Sie 'System.out.println (... .findFirst(). OrElse (" alternative "))' um entweder den Inhalt oder eine Alternative zu drucken, wenn keine Übereinstimmung gefunden wurde. – Holger