Почему отфильтрованные элементы из потока Java могут возвращать пустой список после преобразования строки в список?

Я получил доступ к веб-таблице с помощью селена и собрал все строки таблицы в список:

List<WebElement> nameColumn = driver.findElements(By.xpath("//tbody/tr/td[2]/span"));

Я просмотрел список, getText из элементов и сохранил результат в String:

   for (WebElement tdElement : nameColumn) {
        String records = tdElement.getText();
    
    //To be able to filter the result so as to collect words starting with a particular pattern, I converted the `String` to a `List`:
    
        List<String> myList = new ArrayList<>(Arrays.asList(records.split(",")));
        System.out.println(myList);
}

Выход:

["test1"]
["testme"]
["demoit"]
["sampleit"]
["johndoe"]
["testeurope"]
["testusa"]
["testitaly"]
["gomali"]

Using stream(), я пробовал собирать элементы, начинающиеся с test:

List<String> filteredFields = myList.stream().filter(field -> field.startsWith("test")).collect(Collectors.toList());
System.out.println(filteredFields);

Выход:

[]
[]
[]
[]
[]
[]
[]
[]
[]

Был возвращен пустой список. Почему фильтр может быть пуст? Может ли это быть из-за преобразования String в List? Как мне собрать все элементы, которые startsWithtest?

Весь блок кода выглядит так:

public void demo() throws InterruptedException {
    List<WebElement> nameColumn = driver.findElements(By.xpath("//tbody/tr/td[2]/span"));

    for (WebElement tdElement : nameColumn) {
      String records = tdElement.getText();

      //convert to List
      List<String> myList = new ArrayList<>(Arrays.asList(records.split(",")));
      System.out.println(myList);

      //Get elements that start with test
      List<String> filteredFields = myList.stream().filter(field -> field.startsWith("test")).collect(Collectors.toList());
      System.out.println(filteredFields);
    }
  }

Где именно вы разместили этот код, включающий filteredFields?

Louis Wasserman 15.05.2022 18:45

@ Луи Вассерман, filteredFields держит myList

AutoQA 15.05.2022 18:51

Это не отвечает на мой вопрос. Пожалуйста, покажите полный цикл, начиная с for (WebElement tdElement : nameColumn), включая код filteredFields.

Louis Wasserman 15.05.2022 18:57

Я не знаю, что еще вы ищете. Это весь соответствующий код, за исключением того, что вы ищете имена методов и классов.

AutoQA 15.05.2022 19:01

Я хочу видеть один блок кода, в котором есть и filteredFields, и ваш цикл for, а не два блока кода. Да, вы, вероятно, показали нам «весь соответствующий код», но вы не показали нам, как вы соединили два блока кода вместе, а это актуальная и важная информация.

Louis Wasserman 15.05.2022 19:07

Предусмотрен функциональный блок

AutoQA 15.05.2022 19:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш arraylist содержит слова с кавычками, т.е. "тест1".
Поэтому не стоит проверять напрямую с field.startswith. Но вы должны сначала удалить цитату, а затем проверить field.startswith.
Используйте ниже:

List<String> filteredFields = myList.stream().filter(field -> field.substring(1, field.length()-1).startsWith("test")).collect(Collectors.toList());

Почти правильно. Каждая строка содержит вывод одного списка, сгенерированного в цикле WebElement. Внешние скобки в каждой строке создаются методом ArrayList.toString() и не являются частью данных. Однако кавычки являются частью каждой строки. Итак, ваш ответ правильный, если вы измените смещения с 2 на 1. Или, предпочтительно, просто используйте field.startsWith("test", 1).

Torben 16.05.2022 06:43

@abhinav3414, красиво. Это работает. Спасибо

AutoQA 16.05.2022 14:46

Другие вопросы по теме

Похожие вопросы

Javax.persistence.EntityNotFoundException: невозможно найти kg.library.spring.library_spring.entity.Author с идентификатором 10000001
Разработка наиболее эффективного алгоритма решения задачи с использованием подхода динамического программирования
Переменные теста Spock недоступны в диалоговом окне Evaluate Expression при отладке в IntelliJ IDEA
Вернуть true, если ввод [вводимый символ] «a»-«z» или «A»-«Z», вернуть false в противном случае
Загрузите файлы jar из репозиториев Maven
Невозможно использовать '<>' из-за незащищенного метода, который не переопределяет и не реализует метод из супертипа
Как обрабатывать тайм-аут скрипта для исполнителя javascript для вызова выборки
Java.util.LinkedHashMap нельзя привести к классу com.profile.model.Profile – Spring Boot
Почему библиотека дат thirteen.org возвращает даты одного и того же года для 53-недельного года (для 53-й недели)?
Как отправить несколько значений в запросе GET с использованием CSV в среде Serenity BDD