2016-05-13 18 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; 
} 

それは私に、私はそれだけで私は.map(input -> input.attr("value"))を使用してみました、それは私に与えてくれ__VIEWSTATE "5ue/NxnSLQ2akzQo5R8wBEZ,,."

を与えるように、出力を制御したいと思います次の出力

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

を与えるOptional[5ue/NxnSLQ2akzQo5R8wBEZ,,.

しかし、私はさらに.map(input -> input.attr("name"))をgivに追加すると私の名前に次のエラーが表示される "メソッド 'attr(java.lang.String)'"を解決できません。私はコードで間違っているのですか?その周りに道がありますか?あなたが.map(input -> input.attr("value"))を追加する場合

答えて

2

、あなたはあなたがStream<String>StreamattrString返すと仮定して)、およびStringattrメソッドを持っていないので、第二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: 'System.out.println(... .findFirst())の代わりに' ... .findFirst()。ifPresent(System.out :: println) 'を使用して' Optional'の内容を出力しますここに一つ。または、 'System.out.println(... .findFirst()。orElse(" alternative "))'を使用して、一致するものがない場合は内容または代替を出力します。 – Holger