2016-03-24 5 views
1

私の質問は、JAVA8を使用したラムダとフィルタの使用に関するものです。 これは、さまざまな応答コードをテストするために、JavaのSelenium経由で行われます。マッピングとフィルタリングのレスポンスコードでJavaストリームを使用する

ストリームを使用して以下の関数を変換するには、ラムダをできるだけ簡単に使用できますか?

ストリームに次のように私はリファクタリングしたいコードがあり、Javaの8のラムダ:

 for (int i = 0; i < links.size(); i++) { 
     if (!(links.get(i).getAttribute("href") == null) && !(links.get(i).getAttribute("href").equals(""))) { 
      // Find HTTP Status-Code 
      try { 
       statusCode = getResponseCode(links.get(i).getAttribute("href").trim()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      // Check broken link 
      if (statusCode== 404) { 
       System.out.println("Broken of Link# "+i+" "+links.get(i).getAttribute("href")); 
      } 
      else if (statusCode== 400) { 
       System.out.println("Bad Request# "+i+" "+links.get(i).getAttribute("href")); 
      } 
      else if (statusCode== 401) { 
       System.out.println("Unauthorized# "+i+" "+links.get(i).getAttribute("href")); 
      } 
      else if (statusCode== 403) { 
       System.out.println("Forbidden# "+i+" "+links.get(i).getAttribute("href")); 
      } 
      else if (statusCode== 500) { 
       System.out.println("Internal server error# "+i+" "+links.get(i).getAttribute("href")); 
      } 
     } 

    } 

私は今のところ持っていることである:

私は一緒に何かをしようとしていた
List<AbstractMap.SimpleImmutableEntry<String,Integer>> variablename = 
    links.stream().map(WebElement::getAttribute("href")); 

500,403,401,400,404ではないすべてのものをフィルタリングし、マッピング(linkString、responseCode)のようなものを保持しているだけですが、ラムダを使って正しく動作させるにはちょっとした問題がありますか?

EDIT1: 私はできるように私は、この例ではちょうどそれをできるだけ多く利用するために、ストリームを介しすべてをかけるために

+0

フィルタはこれらのエラーコードに固有のものである必要がありますか、範囲を使用できますか? (2xxと3xx応答は一般的に成功戻りコードとみなされ、4xx&5xxはエラー戻りコードです)。これにより、より一般的なコードを短くすることができます。 – Aaron

+0

あなたは 'System.out'呼び出しを保持しますか? – tddmonkey

+0

私はちょうど範囲を使用すると完璧でなければならないと思います。なぜなら4xxと5xxはエラーリターンコードだからです。 @Aaron –

答えて

1

を意味しませんでしたあなたがそう、作品によってそれを作品を取る場合、それはかなり簡単です:

Set<Integer> acceptableCodes = new HashSet<>(Arrays.asList(404, 400, 401, 403, 500)); 
links.stream() 
    .map(link -> link.getAttribute("href")) 
    .filter(href -> href != null) 
    .filter(href -> !href.equals("")) 
    .filter(href -> acceptableCodes.contains(getResponseCode(href)) 
    .map(link -> new LinkWithCode(href , getResponseCode(href)) 
    .collect(toList()); 

LinkWithCodeあなたがHOに作成する必要がありますクラスです:あなたは簡単にそれを読むことができるようにコメントせずに一緒にそれを置く

// create a set of codes you want to include 
Set<Integer> acceptableCodes = new HashSet<>(Arrays.asList(404, 400, 401, 403, 500)); 

// for (int i = 0; i < links.size(); i++) { 
links.stream() 

// convert to the href value as that's all we need later on 
.map(link -> link.getAttribute("href")) 

// filter out anything without a href 
// if (!(links.get(i).getAttribute("href") == null) && !(links.get(i).getAttribute("href").equals(""))) { 
.filter(href -> href != null) 
.filter(href -> !href.equals("")) 

// filter out non-matching status codes 
.filter(href -> acceptableCodes.contains(getResponseCode(href)) 
.map(link -> new LinkWithCode(href , getResponseCode(href)) 
.collect(toList()); 

リンクとステータスコード。これは、2回起こっているので、getResponseCodeは重量操作ではないと仮定しています。

注意:私はこれをテストしていないか、IDEに入れておきます。

関連する問題