为什么从 Java 中筛选出的元素在 String 转换为 List 后会流 return 一个空列表?
Why could the filtered elements from a Java stream return an empty list after a String was converted to List?
我用 selenium 访问了一个网站 table 并将所有 table 行收集到一个列表中:
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
?如何收集所有 startsWith
test
?
的元素
整个代码块如下所示:
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);
}
}
您的数组列表包含带引号的单词,即 " test1 "。
这就是为什么您不应该直接使用 field.startswith
检查的原因。但是您应该先删除引号,然后检查 field.startswith
。
请使用以下:
List<String> filteredFields = myList.stream().filter(field -> field.substring(1, field.length()-1).startsWith("test")).collect(Collectors.toList());
我用 selenium 访问了一个网站 table 并将所有 table 行收集到一个列表中:
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
?如何收集所有 startsWith
test
?
整个代码块如下所示:
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);
}
}
您的数组列表包含带引号的单词,即 " test1 "。
这就是为什么您不应该直接使用 field.startswith
检查的原因。但是您应该先删除引号,然后检查 field.startswith
。
请使用以下:
List<String> filteredFields = myList.stream().filter(field -> field.substring(1, field.length()-1).startsWith("test")).collect(Collectors.toList());