2016-05-13 56 views
3

我有以下代碼。Java 8流API控制輸出

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; 
} 

它給了我下面的輸出

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

我想控制輸出,因此只給了我__VIEWSTATE "5ue/NxnSLQ2akzQo5R8wBEZ,,."

我用.map(input -> input.attr("value"))嘗試,這讓我Optional[5ue/NxnSLQ2akzQo5R8wBEZ,,.

但是當我增加一個額外.map(input -> input.attr("name"))也giv e我的名字我得到以下錯誤「無法解析方法'attr(java.lang.String)'」。我在代碼中做錯了什麼?有沒有辦法解決它?

回答

2

如果添加一個.map(input -> input.attr("value")),您轉換您StreamStream<String>(假設attr返回String)和String沒有一個attr方法,所以第二map通話不通過彙編(因此編譯錯誤 - Cannot resolve method 'attr(java.lang.String)')。

您可以使用單個map操作來獲取這兩個屬性。例如:

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

謝謝@Eran。這樣可行。我現在得到的輸出是'Optional [__ VIEWSTATE fmxGAU4TK1P1'。有沒有辦法擺脫'可選['在輸出中? – g3blv

+3

@ user148095:使用'... .findFirst()。ifPresent(System.out :: println)'來打印'Optional'的內容,而不是使用'System.out.println(... .findFirst())有一個。或者使用'System.out.println(... .findFirst()。或者Esese(「alternative」))'來打印內容或者如果沒有匹配則打印替代內容。 – Holger