2017-12-21 3 views
-2

私はJava 8で以下のコードを変換しようとしていますが、どこが間違っているのかわかりません。私は変換したい2つのコードスニペットを持っています。これは最初のものです:java8で複数の条件付きオペレーターを設定するには

for (WebElement value :values) { 
    WebElement dateElement = SharedWebDriver.getInstance() 
      .findOptionalElement(By.className("text"), value); 
    WebElement groupElement = 
    SharedWebDriver.getInstance().findOptionalElement(By.id("label"), 
    value); 
    WebElement typeElement = 
    SharedWebDriver.getInstance().findOptionalElement(By.id("type"), 
    value); 
    if (dateElement != null) { 
     dateValue = dateElement.getText().trim(); 
    } 
    if (groupElement != null) { 
     groupValue = groupElement.getText().trim(); 
    } 
    if(typeElement!= null){ 
     typeValue = typeElement.getText().trim(); 
    } 
} 

ここで私は値を設定するにはjava 8を使用します。フィルターオプションを使用して試しましたが、機能しません。

for (WebElement header : headers) { 
    if (header != null) { 
     if (header.getText().equals("A")) { 
      entry.setDate(dateValue); 
     } else if (header.getText().equals("B")) { 
      entry.setGroup(groupValue); 
     } else if (header.getText().equals("C")) { 
      entry.setType(typeValue); 
     } 
    } 
} 

誰も私を助けることができますか?

+5

Java 1、2、3 ... 7のコードはJava 8でコンパイルされます。何も変更する必要はありません。 **あなたが**何かを変えたいなら、あなたがやろうとしたことを私たちに見せて、あなたが直面した問題を正確に教えてください。 –

+0

私は以前のコメントに同意しています。このコードはJava 8で正常に動作します。これを変更してStream APIを使用すると、実際の勝利は表示されません。 – Makoto

答えて

-1

これらのコードスニペットの問題は、ループ外で定義された変数を変更することです(最初のものはdateValue、groupValueおよびtypeValue、もう1つはentryValue)。
ラムダ式は、実際にスコープイベントで定義されていない変数を変更することは想定されていませんが、そのスルーメソッドを実現できます。

例えば、ラムダ式内:website.setTitle("title")

私は、Java 8でコードスニペットを変換します一方
word = "hello"が動作しません、私はそれをテストする時間を取ることはありませんでしたが、私ならば私は場合誤解されていません。最初のものは動作しませんが、2番目のものは上記の理由で動作します。

values.stream() 
    .map(value -> new WebElement[] {  
    SharedWebDriver.getInstance().findOptionalElement(By.className("text"), value),   
    SharedWebDriver.getInstance().findOptionalElement(By.id("label"), value)), 
    SharedWebDriver.getInstance().findOptionalElement(By.id("type"), value) }) 
    .forEach(webElements[] -> { 
    if (webElements[0] != null) { 
     dateValue = webElements[0].getText().trim(); 
    } 
    if (webElements[1] != null) { 
     groupValue = webElements[1].getText().trim(); 
    } 
    if(webElements[2] != null){ 
     typeValue = webElements[2].getText().trim(); 
    } 
    }); 

headers.stream() 
    .filter(Objects::nonNull) 
    .forEach(header -> { 
    if (header.getText().equals("A")) { 
     entry.setDate(dateValue); 
    } else if (header.getText().equals("B")) { 
     entry.setGroup(groupValue); 
    } else if (header.getText().equals("C")) { 
     entry.setType(typeValue); 
    } 
    }); 
+1

私は個人的に 'forEach'の使用を妨げます。なぜなら、それはストリームよりも多くの外部ループの使用に似ているからです。 APIにはこのような柔軟性がありますが、これは実際にはコードの可読性から離れています。 – Makoto

+0

OPは彼のコードをJava 8で変換したかったし、forEachなしでそれをする方法がない。なぜ有効な答えをdownvotingするのですか?私はそれを行う良い方法を言っていないが、OPはJava 8を望んでいるので、よくやった。 –

+0

OPが望んでいるのはそれが賢明なアプローチであるという意味ではなく、実用的なアプローチでもあります。もう一度、あなたが 'forEach'を使っているという事実は私の本のにおいがまだ残っています。ストリームは副作用がないことを意図しており、 'forEach'を使うことは副作用を*明示的に許すことです。 – Makoto

関連する問題