У меня есть следующий список:
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!")
}
}
Но так как я только начал изучать потоки, я хотел бы изучить этот метод вместо метода зацикливания.
Ой, это напоминает мне школу, где мы писали код на французском. Я нашел это уродливым, но я не осознавал, насколько это усложняет чтение кода для людей, которые не понимают языка. Почему-то читать это тяжелее, чем читать абстрактные a, b, c как идентификаторы (по крайней мере, для меня)
Я пишу здесь, чтобы найти строку из списка, что я понимаю.
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()? То есть утверждать, что есть совпадение в одной из строк в списке?
Да, вы можете использовать метод anyMatch класса Stream, чтобы проверить, есть ли совпадение в одной из строк в списке, а затем использовать его внутри инструкции assertThat, чтобы проверить, истинно ли условие. assertThat(tidslinjehendelser.stream().anyMatch { hendelse -> hendelse.innhold().contains(melding) }).isTrue()
Отвечает ли это на ваш вопрос? Java — поиск элемента в массиве с использованием условия и лямбда