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

时间:2019-04-03 07:54:59

标签: java java-8 java-stream predicate

我正在尝试搜索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);
}

3 个答案:

答案 0 :(得分:4)

idsList<String>,而elemString。因此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)说的是绝对正确的,我倾向于他们,我只是想用我的理解添加更清晰的解释。