具有循环的Lambda表达式包含很少的操作

时间:2015-09-13 15:12:11

标签: java lambda java-8

请您给我一个提示,如何为下一个Java代码创建lambda表达式:

for (String symbol : word) {
  sendKeys(symbol);

  if (isElementVisible(word)) {
    clickByVisibleText(word);
    break;
  }
}

我理解如何使用if表达式来实现循环周期,但是如果循环包含某些方法(like sendKeys())以及使用break运算符,我不明白我该怎么做。

1 个答案:

答案 0 :(得分:0)

我想你的意思是使用lambda表达式将集合上的外部迭代更改为内部迭代。

您可能正在努力突然完成内部forEach()循环。

根据Iterable.forEach()的文档:

  

Iterable 的每个元素执行给定操作,直到处理完所有元素或操作引发异常 ...异常抛出的异常动作转发给来电者。

因此,不是使用break,而是抛出一个会立即破坏内部循环的异常。

代码将是这样的 - 我不能说我喜欢它但它有效。您可以创建自己的类BreakException,其范围为RuntimeException

try {
    word.forEach(symbol -> {
        sendKeys(symbol);
        if (isElementVisible(word)) { // see N.B.
            clickByVisibleText(word);
            throw new BreakException();
        }
    });
}
catch (BreakException e) {
        // here you know that your condition has been fulfilled at least once
}

请注意,lambda表达式周围的try...catch 不是,而是围绕整个forEach()方法。为了使其更加明显,请参阅以下代码转录,以便更清楚地显示:

Consumer<? super String> findElement = symbol -> {
    sendKeys(symbol);
    if (isElementVisible(word)) { // see N.B.
        clickByVisibleText(word);
        throw new BreakException();
    }
});

try {
    word.forEach(findElement);
}
catch (BreakException e) {
    // here you know that your condition has been fulfilled at least once
}

N.B。:请重新考虑您的代码

if (isElementVisible(word)) {
    clickByVisibleText(word);
    throw new BreakException();
}

看起来很可疑。在循环的中间,你一直指的是整个集合word,它们很臭。