我正在尝试搜索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);
}
答案 0 :(得分:4)
ids
是List<String>
,而elem
是String
。因此ids.get(elem)
是无效的,因为List
没有使用get
的{{1}}方法。
应该是:
String
哦,由于您的方法具有private boolean findIdInTheList(List<String> ids, String id) {
String theId = ids.stream()
.filter(elem -> id.equals(elem))
.findAny()
.orElse(null);
}
返回类型,因此您应该添加一个return语句。
您可以使用boolean
简化管道:
anyMatch
在这里您将得到一个private boolean findIdInTheList(List<String> ids, String id) {
return ids.stream()
.anyMatch(elem -> id.equals(elem));
}
,指示是否在boolean
中找到了id
。我不认为返回List
本身是没有意义的,因为您已经知道它等于String
。
答案 1 :(得分:3)
.filter(elem -> id.equals(elem))
在此elem
中,您已经从源头获得了Predicate
您也可以将其编写为方法参考:
.filter(id::equals)
答案 2 :(得分:0)
.filter(elem -> id.equals(ids.get(elem)))
在这里是错误的,您已经完成ids.stream()
,这意味着ids
( id 的所有元素)已经转换为流并显示在通过filter()
还是失败。
现在,您要使用filter()
这是一个谓词,并将返回bool(真或假)。
现在,您只需要将字符串元素与流值进行比较,就无需通过执行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)说的是绝对正确的,我倾向于他们,我只是想用我的理解添加更清晰的解释。