Java 两个循环用于输入流

Java 两个循环用于输入流,java,selenium,for-loop,java-stream,Java,Selenium,For Loop,Java Stream,我有一些字符串方法,其中有两个for和if: public String getCellValue(String stringFirst, int integerFirst) { List<WebElement> tableRows = driver.findElements(By.xpath("//table[@id='dt']/tbody/tr")); int index = 0; WebElement dataCell = null

我有一些字符串方法,其中有两个for和if:

public String getCellValue(String stringFirst, int integerFirst) {
    List<WebElement> tableRows = driver.findElements(By.xpath("//table[@id='dt']/tbody/tr"));

    int index = 0;
    WebElement dataCell = null;

    for (WebElement row : tableRows) {
        index++;

        List<WebElement> tableCells = row.findElements(By.tagName("td"));

        for (WebElement cell : tableCells) {

            if (getTextFromElement(cell).equals(stringFirst)) {

                dataCell = driver.findElement(By.xpath(String.format("//table[@id='dt']/tbody/tr[%s]/td[%s]", index, integerFirst)));
            }
        }
    }

    return getTextFromElement(dataCell);
}
public String getCellValue(String stringFirst,int integerFirst){
List tableRows=driver.findelelements(By.xpath(//table[@id='dt']]/tbody/tr”);
int指数=0;
WebElement-dataCell=null;
for(WebElement行:tableRows){
索引++;
List tableCells=row.findElements(按.tagName(“td”));
for(WebElement单元格:tableCells){
if(getTextFromElement(cell).equals(stringFirst)){
dataCell=driver.findElement(By.xpath(String.format(“//table[@id='dt']/tbody/tr[%s]/td[%s]”,index,integerFirst));
}
}
}
返回getTextFromElement(数据单元);
}
我仍然尝试将这个实现更改为一些流。在这种情况下可能吗?我尝试了许多选项,但在索引(index++;)和tableCells中的过滤器(按.tagname)时遇到了问题。我认为不可能将full方法更改为stream,但我不知道。你能帮我做些实施吗?

非常感谢。

这并不是您在这里要问的问题,但是当您试图从每一行中获取“tableCells”时,我很确定这并没有达到您的预期

List<WebElement> tableCells = row.findElements(By.tagName("td"));

了解给定数据:

List<WebElement> tableRows = driver.findElements(By.xpath("//table[@id='dt']/tbody/tr"));
        
Predicate<Map.Entry> containsCellWithText = (Map.Entry me) -> me.getValue()
                                                                .stream()
                                                                .anyMatch(cell -> getTextFromElement(cell).equals(stringFirst));
        
IntStream.rangeClosed(1,tableRows.size())
         .boxed()
         .map(idx -> Map.of(idx, list.get(idx-1).findElements(By.tagName("td"))))
         .flatMap(m -> m.entrySet().stream())
         .filter(containsCellValue)
         .findAny()
         .map(me -> driver.findElement(By.xpath(String.format("//table[@id='dt']/tbody/tr[%s]/td[%s]", me.getKey(), integerFirst))))
         .orElse("")
要获取所有行,请执行以下操作:

driver.findElements(By.xpath("//table[@id='dt']/tbody/tr"))

要获取给定行的列(单元格),请执行以下操作:

row.findElements(By.tagName("td"))
要获取给定列(单元格)的文本,请执行以下操作:

如果行索引处单元格上的文本与给定字符串(stringFirst)匹配,则应为结果:

从需求来看,逻辑似乎应该围绕索引

方法分类:

List<WebElement> tableRows = driver.findElements(By.xpath("//table[@id='dt']/tbody/tr"));
        
Predicate<Map.Entry> containsCellWithText = (Map.Entry me) -> me.getValue()
                                                                .stream()
                                                                .anyMatch(cell -> getTextFromElement(cell).equals(stringFirst));
        
IntStream.rangeClosed(1,tableRows.size())
         .boxed()
         .map(idx -> Map.of(idx, list.get(idx-1).findElements(By.tagName("td"))))
         .flatMap(m -> m.entrySet().stream())
         .filter(containsCellValue)
         .findAny()
         .map(me -> driver.findElement(By.xpath(String.format("//table[@id='dt']/tbody/tr[%s]/td[%s]", me.getKey(), integerFirst))))
         .orElse("")
首先,我们需要一个行列表。这与之前完全相同:

List<WebElement> tableRows = driver.findElements(By.xpath("//table[@id='dt']/tbody/tr"));
对于每个索引idx,创建一个映射,idx作为键,与行idx对应的列作为值:

.map(idx -> Map.of(idx, list.get(idx-1).findElements(By.tagName("td"))))
合并所有地图:

.flatMap(m -> m.entrySet().stream())
筛选出不包含以文本作为给定字符串的单元格的值:
如果找到任何值,findAny()将返回可选值(不确定这是否是必需的)

上述谓词的实现:

Predicate<Map.Entry> containsCellWithText = (Map.Entry me) -> me.getValue()
                                                                .stream()
                                                                .anyMatch(cell -> getTextFromElement(cell).equals(stringFirst));
我们应该有可选的答案(如果存在)。获取它或获取空字符串:

.orElse("")
将完整答案放在一起:

List<WebElement> tableRows = driver.findElements(By.xpath("//table[@id='dt']/tbody/tr"));
        
Predicate<Map.Entry> containsCellWithText = (Map.Entry me) -> me.getValue()
                                                                .stream()
                                                                .anyMatch(cell -> getTextFromElement(cell).equals(stringFirst));
        
IntStream.rangeClosed(1,tableRows.size())
         .boxed()
         .map(idx -> Map.of(idx, list.get(idx-1).findElements(By.tagName("td"))))
         .flatMap(m -> m.entrySet().stream())
         .filter(containsCellValue)
         .findAny()
         .map(me -> driver.findElement(By.xpath(String.format("//table[@id='dt']/tbody/tr[%s]/td[%s]", me.getKey(), integerFirst))))
         .orElse("")
List tableRows=driver.findElements(By.xpath(“//table[@id='dt']/tbody/tr”);
谓词containsCellWithText=(Map.Entry me)->me.getValue()
.stream()
.anyMatch(cell->getTextFromElement(cell).equals(stringFirst));
IntStream.rangeClosed(1,tableRows.size())
.boxed()
.map(idx->map.of(idx,list.get(idx-1).findElements(按.tagName(“td”)))
.flatMap(m->m.entrySet().stream())
.filter(containsCellValue)
.findAny()
.map(me->driver.findElement(By.xpath(String.format(“//table[@id='dt']]/tbody/tr[%s]/td[%s]”,me.getKey(),integerFirst)))
.orElse(“”)
资源:

List<WebElement> tableRows = driver.findElements(By.xpath("//table[@id='dt']/tbody/tr"));
        
Predicate<Map.Entry> containsCellWithText = (Map.Entry me) -> me.getValue()
                                                                .stream()
                                                                .anyMatch(cell -> getTextFromElement(cell).equals(stringFirst));
        
IntStream.rangeClosed(1,tableRows.size())
         .boxed()
         .map(idx -> Map.of(idx, list.get(idx-1).findElements(By.tagName("td"))))
         .flatMap(m -> m.entrySet().stream())
         .filter(containsCellValue)
         .findAny()
         .map(me -> driver.findElement(By.xpath(String.format("//table[@id='dt']/tbody/tr[%s]/td[%s]", me.getKey(), integerFirst))))
         .orElse("")

看起来不错。我会检查一下。请注意,一些操作,如Map.of()在Java9以后的版本中都可以使用
1=[cell11, cell12, cell13],
2=[cell21, cell22, cell23],
...
.filter(containsCellWithText).findAny()

Predicate<Map.Entry> containsCellWithText = (Map.Entry me) -> me.getValue()
                                                                .stream()
                                                                .anyMatch(cell -> getTextFromElement(cell).equals(stringFirst));
.map(me -> driver.findElement(By.xpath(String.format("//table[@id='dt']/tbody/tr[%s]/td[%s]", me.getKey(), integerFirst))))
.orElse("")
List<WebElement> tableRows = driver.findElements(By.xpath("//table[@id='dt']/tbody/tr"));
        
Predicate<Map.Entry> containsCellWithText = (Map.Entry me) -> me.getValue()
                                                                .stream()
                                                                .anyMatch(cell -> getTextFromElement(cell).equals(stringFirst));
        
IntStream.rangeClosed(1,tableRows.size())
         .boxed()
         .map(idx -> Map.of(idx, list.get(idx-1).findElements(By.tagName("td"))))
         .flatMap(m -> m.entrySet().stream())
         .filter(containsCellValue)
         .findAny()
         .map(me -> driver.findElement(By.xpath(String.format("//table[@id='dt']/tbody/tr[%s]/td[%s]", me.getKey(), integerFirst))))
         .orElse("")