Есть ли способ выполнить две операции сопоставления с использованием потоков Java здесь? - PullRequest
1 голос
/ 25 апреля 2020

Я пытаюсь поиграть с автоматизацией онлайн-игры, и я застрял.

Что я пытаюсь сделать: я пытаюсь проанализировать свои отчеты. Первый шаг включает выбор родительского ряда. Вторым шагом является фильтрация родительской строки на основе того, читается ли отчет или нет, и имеет ли отчет сегодняшнюю дату.

this.driver.findElements(this.reportRow).stream()
            .filter(reportElement -> reportElement.findElement(this.unreadReports).isDisplayed()
                    && reportElement.findElement(this.todaysReport).getText().contains(this.bountyDate))
            .map(reportRow -> {
                String villageName = reportRow.findElement(this.unreadReports).getText().replace("mwldjt raids ", "");
                String bounty = reportRow.findElement(this.bountyElement).getText();
                System.out.println("Village: " + villageName + " Bounty: " + bounty);
                return new String[]{bounty, villageName};
            })
            .forEach(entry -> System.out.println("Entry:" + entry[0] + ", " + entry[1])

Вот HTML, который я пытаюсь проанализировать .

<tr>
    <td class="sel">
        <input class="check" name="n1" type="checkbox" value="14180678">
    </td>
    <td class="sub newMessage">
        <a href="berichte.php?id=14180678&amp;t=1&amp;s=0&amp;page=1&amp;toggleState=0">
            <img alt="unread" class="messageStatus messageStatusUnread" src="img/x.gif">
        </a>
        <img alt="Won as attacker with losses." class="iReport iReport2 " src="img/x.gif">
        <a class="reportInfoIcon" href="build.php?id=39&amp;tt=2&amp;bid=14180678"><img alt="16/100" class="reportInfo carry half"
                                                                                        src="img/x.gif"></a>
        <div class="">
            <a href="berichte.php?id=14180678%7C5fa6b3d7&amp;t=1&amp;s=1">mwldjt raids Natars 36|64</a>
        </div>
        <div class="clear"></div>
    </td>
    <td class="dat">
        24/04/20, 04:08 am
    </td>
</tr>

Я пытаюсь поймать награду и название деревни в LinkedHashmap. Я заменил 'положить' в блоке foreach на метод печати сейчас.

Проблема:

Мне нужно выполнить две операции - получить данные из двух элементов, которые l ie в родительском ряду. Я пытался понять, как это сделать, но теперь я думаю, что мне нужна помощь. Спасибо, что нашли время.

1 Ответ

2 голосов
/ 25 апреля 2020

A forEach с операцией put над LinkedHashMap может быть преобразовано в

.collect(Collectors.toMap(<key-fn>, <value-fn>, <merge-fn>, LinkedHashMap::new)

, поэтому полученный вами код может быть преобразован в

LinkedHashMap<String, String> output =  this.driver.findElements(this.reportRow).stream()
            .filter(reportElement -> reportElement.findElement(this.unreadReports).isDisplayed()
                    && reportElement.findElement(this.todaysReport).getText().contains(this.bountyDate))
            .map(reportRow -> {
                String villageName = reportRow.findElement(this.unreadReports).getText().replace("mwldjt raids ", "");
                String bounty = reportRow.findElement(this.bountyElement).getText();
                System.out.println("Village: " + villageName + " Bounty: " + bounty);
                return new String[]{bounty, villageName};
            })
            .collect(Collectors.toMap(e -> e[0], e -> e[1], (a,b) -> b, LinkedHashMap::new);

Конечно, операции получения названия деревни и награды могли быть извлечены и помещены непосредственно в toMap Collector в такой форме, как:

LinkedHashMap<String, String> output =  this.driver.findElements(this.reportRow).stream()
            .filter(reportElement -> isValidReportElement(reportElement))
            .collect(Collectors.toMap(reportElement -> getVillageName(reportElement), 
                    reportElement -> getBounty(reportElement), (a,b) -> b, LinkedHashMap::new);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...