我正在尝试在List<String>
中搜索一个元素,我得到了这个编译错误:
get(int)
类型中的方法List<String>
不适用于参数字符串。
这是代码:
private boolean findIdInTheList(List<String> ids, String id) {
String theId = ids.stream()
.filter(elem -> id.equals(ids.get(elem)))
.findAny()
.orElse(null);
}
ids
是List<String>
,elem
是String
。因此ids.get(elem)
是无效的,因为List
没有采用get
的String
方法。
它应该是:
private boolean findIdInTheList(List<String> ids, String id) {
String theId = ids.stream()
.filter(elem -> id.equals(elem))
.findAny()
.orElse(null);
}
哦,既然你的方法有一个boolean
返回类型,你应该添加一个return语句。
您可以使用anyMatch
简化管道:
private boolean findIdInTheList(List<String> ids, String id) {
return ids.stream()
.anyMatch(elem -> id.equals(elem));
}
在这里你得到一个boolean
,表明id
是否在List
中被发现。我认为回归String
本身毫无意义,因为你已经知道它等于id
。
.filter(elem -> id.equals(elem))
你已经从这个elem
的源头获得了Predicate
您也可以将其编写为方法参考:
.filter(id::equals)
.filter(elem -> id.equals(ids.get(elem)))
在这里是错误的,你已经完成了ids.stream()
,这意味着ids
(所有ids的元素)已经转换为流并且通过filter()
存在或通过。
现在你正在应用一个谓词的filter()
并将返回bool(true或false)。
现在你只需要将你的字符串元素与流值进行比较,你不需要再通过执行get()
进入List。
为了更好地理解不同的方法:
List<String> ids = Arrays.asList("Vishwa","Eran","Eugene","gaby","nullpointer");
String id = "gaby";
Predicate<String> pre = (p1)->p1.equals("gaby");
String theID = ids.stream().filter(s->pre.test(id)).findAny().orElse(null);
以上用户(Eran和Eugene)所说的绝对正确,我倾向于他们,我只是想用我理解的内容添加更清晰的解释。