2016-05-13 69 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