Kotlin или Java: использование stream() для поиска элемента в списке

У меня есть следующий список:

val tidslinjehendelser = kontaktPage.tidslinjeCard().getTidslinjehendelser()

fun getTidslinjehendelser(): MutableList<TidslinjehendelseElement> {
    return Getters.getElementsInElement(element, By.tagName("tidslinje-hendelse")).stream()
        .map { el: WebElement? -> TidslinjehendelseElement(el) }.collect(Collectors.toList())
}

Который создается из этого класса:

class TidslinjehendelseElement(private val element: WebElement?) {
    fun dato(): String {
    return getElementInElement(element, By.cssSelector("[data-e2e-selector=tidslinje-hendelse-dato]")).text
    }
    
    fun navn(): String { return getElementInElement(element, By.className("hendelse-navn")).text }
    
    fun innhold(): String { return getElementInElement(element, By.className("hendelse-body")).text }
}

Что я хочу сделать, так это найти элемент, в котором текст innhold() содержит определенную текстовую строку.

Прямо сейчас я делаю это с циклом:

for (hendelse in tidslinjehendelser) {
    if (hendelse.innhold().contains(melding)) {
        print("yay!")
    }
}

Но так как я только начал изучать потоки, я хотел бы изучить этот метод вместо метода зацикливания.

Отвечает ли это на ваш вопрос? Java — поиск элемента в массиве с использованием условия и лямбда

Chaosfire 15.02.2023 10:39

Ой, это напоминает мне школу, где мы писали код на французском. Я нашел это уродливым, но я не осознавал, насколько это усложняет чтение кода для людей, которые не понимают языка. Почему-то читать это тяжелее, чем читать абстрактные a, b, c как идентификаторы (по крайней мере, для меня)

Joffrey 15.02.2023 11:53
Лучшая компания по разработке спортивных приложений
Лучшая компания по разработке спортивных приложений
Ищете лучшую компанию по разработке спортивных приложений? Этот список, несомненно, облегчит вашу работу!
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Blibli Automation Journey - Как захватить сетевой трафик с помощью утилиты HAR в Selenium 4
Если вы являетесь веб-разработчиком или тестировщиком, вы можете быть знакомы с Selenium, популярным инструментом для автоматизации работы...
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Фото ️🔁 Radek Jedynak 🔃 on ️🔁 Unsplash 🔃
Что такое Java 8 Streams API? Java 8 Stream API
Деревья поиска (Алгоритм4 Заметки к учебнику)
Деревья поиска (Алгоритм4 Заметки к учебнику)
(1) Двоичные деревья поиска: среднее lgN, наихудшее N для вставки и поиска.
0
2
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я пишу здесь, чтобы найти строку из списка, что я понимаю.

List<String> result = list.stream()
  .filter(x -> x.contains("string")
  .collect(Collectors.toList());

Давайте держать в курсе, если вам нужна дополнительная помощь

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

Вы можете использовать потоки для фильтрации списка tidslinjehendelser, чтобы получить только те элементы, чей метод innhold() возвращает строку, содержащую определенную текстовую строку. Вот пример:

tidslinjehendelser.stream()
.filter { hendelse -> hendelse.innhold().contains(melding) }
.forEach { hendelse -> println("yay!") }

Этот код использует метод stream() для преобразования списка tidslinjehendelser в поток. Затем он использует метод filter() для фильтрации потока и сохранения только тех элементов, чей метод innhold() возвращает строку, содержащую объединенный текст. Наконец, он использует метод forEach() для циклического просмотра отфильтрованного потока и вывода «yay!» для каждого соответствующего элемента.

Вы можете заменить оператор println("yay!") любым другим кодом, который вы хотите выполнить для соответствующих элементов. Также обратите внимание, что этот код перестанет перебирать поток, как только найдет первый соответствующий элемент. Если вы хотите найти все совпадающие элементы, вы можете использовать метод collect() вместо forEach(), чтобы собрать совпадающие элементы в новый список или другую коллекцию.

Спасибо :-) Как насчет того, чтобы поместить поток внутрь assertThat()? То есть утверждать, что есть совпадение в одной из строк в списке?

kakemonsteret 15.02.2023 11:59

Да, вы можете использовать метод anyMatch класса Stream, чтобы проверить, есть ли совпадение в одной из строк в списке, а затем использовать его внутри инструкции assertThat, чтобы проверить, истинно ли условие. assertThat(tidslinjehendelser.stream().anyMatch { hendelse -> hendelse.innhold().contains(melding) }).isTrue()

Hafizur Rahman Arfin 15.02.2023 18:45

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