Метод get (int) в типе List <String>не применим для строки аргумента в Java 8 - PullRequest
9 голосов
/ 03 апреля 2019

Я пытаюсь найти элемент в 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 ]

4 голосов
/ 03 апреля 2019

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, вы должны добавить оператор возврата.

Вы можете упростить конвейер с помощью anyMatch:

private boolean findIdInTheList(List<String> ids, String id) {
    return ids.stream()
              .anyMatch(elem -> id.equals(elem));
}

Здесь вы получите boolean, который указывает, был ли id найден в List. Я не вижу смысла возвращать сам String, так как вы уже знаете, что он равен id.

3 голосов
/ 03 апреля 2019
.filter(elem -> id.equals(elem))

у вас уже есть elem от источника в этом Predicate

Вы также можете написать его как ссылку на метод:

.filter(id::equals) 
0 голосов
/ 03 апреля 2019

.filter(elem -> id.equals(ids.get(elem))) здесь не так, вы уже сделали ids.stream(), что означает ids (все элементы идентификаторы ) уже преобразованы в поток и присутствуют для прохождения или отказа через filter() .

Теперь вы применяете filter(), который является предикатом и возвращает bool (true или false).

Теперь вам просто нужно сравнить ваш строковый элемент со значением потока, вам не нужно снова входить в List, выполнив get().


Ради большего понимания с другим подходом:

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);

То, что вышеупомянутые пользователи (Эран и Юджин) сказали, абсолютно правильно, я склонялся к ним, я просто хотел добавить более четкое объяснение того, что я понимаю.

...