Java 8 - 如何使用带参数函数的谓词?

时间:2015-09-01 13:03:02

标签: java lambda java-8 java-stream predicate

我有以下代码:

<table class="table table-bordered">
     <?php foreach($details as $detail):?>
         <tr>
            <td>
                <input class="chkSelect" type="checkbox"  value="<?php echo $detail['OrderId'];?>"  name="checkbox">
            <td>
                <?= $detail['OrderId']?>
            </td>
            <td>
                <?= $detail['CustomerName']?>
            </td>
            <td>
                <?=$detail['Address']?>
            </td>
            <td>
                <?=$detail['ZipCode']?>
            </td>
            <td>
                <?=$detail['FinanicalStatus']?>
            </td>
            <td>
                <?=$detail['Payment']?>
            </td>
            <td>
                <select class="courier"> <!--Change this to class-->
                    <option>(choose one)</option>
                    <option value='1'>Bluedart</option>
                    <option value='2'>Delhivery</option>
                    <option value='3'>DTDC</option>
                    <option value='4'>IndiaPost</option>
                </select>
            </td>
        </tr>
   <?php endforeach; ?>
</table>

将其转换为使用Java 8 public boolean isImageSrcExists(String imageSrc) { int resultsNum = 0; List<WebElement> blogImagesList = driver.findElements(blogImageLocator); for (WebElement thisImage : blogImagesList) { if (thisImage.getAttribute("style").contains(imageSrc)) { resultsNum++; } } if (resultsNum == 2) { return true; } else { return false; } } s?

的正确方法是什么?

当我尝试使用Stream时,我收到错误,因为map()不是getAttribute

Function

2 个答案:

答案 0 :(得分:12)

您无法完全按照自己的意愿行事 - 方法参考中不允许使用显式参数。

但你可以......

...创建一个方法,该方法返回一个布尔值并将调用编码为getAttribute("style")

public boolean getAttribute(final T t) {
    return t.getAttribute("style");
}

这将允许您使用方法ref:

int a = (int) blogImagesList.stream()
              .map(this::getAttribute)
              .filter(s -> s.contains(imageSrc))
              .count();

...或者你可以定义一个变量来保存函数:

final Function<T, R> mapper = t -> t.getAttribute("style");

这将允许您简单地传递变量

int a = (int) blogImagesList.stream()
              .map(mapper)
              .filter(s -> s.contains(imageSrc))
              .count();

......或者你可以讨论并结合上述两种方法(这肯定是可怕的过度杀伤)

public Function<T,R> toAttributeExtractor(String attrName) {
    return t -> t.getAttribute(attrName);
}

然后,您需要致电toAttributeExtractor以获取Function并将其传递到map

final Function<T, R> mapper = toAttributeExtractor("style");
int a = (int) blogImagesList.stream()
              .map(mapper)
              .filter(s -> s.contains(imageSrc))
              .count();

虽然,实际上,简单地使用lambda会更容易(正如你在下一行所做的那样):

int a = (int) blogImagesList.stream()
              .map(t -> t.getAttribute("style"))
              .filter(s -> s.contains(imageSrc))
              .count();

答案 1 :(得分:7)

您无法将参数传递给方法引用。您可以改为使用lambda表达式:

int a = (int) blogImagesList.stream()
                            .map(w -> w.getAttribute("style"))
                            .filter(s -> s.contains(imageSrc))
                            .count();