方法get(int)在List类型中 不适用于Java 8中的参数字符串

问题描述 投票:9回答:3

我正在尝试在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);
}
java java-8 java-stream predicate
3个回答
4
投票

idsList<String>elemString。因此ids.get(elem)是无效的,因为List没有采用getString方法。

它应该是:

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


3
投票
.filter(elem -> id.equals(elem))

你已经从这个elem的源头获得了Predicate

您也可以将其编写为方法参考:

.filter(id::equals) 

0
投票

.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)所说的绝对正确,我倾向于他们,我只是想用我理解的内容添加更清晰的解释。

© www.soinside.com 2019 - 2024. All rights reserved.