Java в действии 8 - лямбда-выражения и ссылки на методы - PullRequest
0 голосов
/ 27 июня 2018

Согласно Java 8 в действии,

(str, i) -> str.substring (i) эквивалентно ссылке на метод String :: substring

Мой код выглядит следующим образом ..

С лямбдой,

String s = "HELLO WORLD";
BiFunction<String, Integer, String> biFunc = (String s, Integer i) -> s.substring(i);

Справочник методов

Но следующий код выдает ошибку времени компиляции, говоря, что не удается разрешить подстроку метода

BiFunction<String, Integer, String> biFunc1 = s1::substring;

Пожалуйста, помогите мне понять, чего мне не хватает! Спасибо

1 Ответ

0 голосов
/ 27 июня 2018

Непонятно, что такое s1 в s1::substring. Если s1 является экземпляром String и вы пытались создать ссылку на метод для определенного экземпляра String, эта ссылка на метод не соответствует функциональному интерфейсу BiFunction, поскольку для вызова biFunc1.apply() требуется предоставить String и Integer, но вы уже указали конкретный экземпляр String в ссылке на метод s1::substring.

С другой стороны, s1::substring соответствует функциональному интерфейсу Function<Integer,String>.

Чтобы создать BiFunction требуемого типа, используйте ссылку на метод не определенного экземпляра:

BiFunction<String, Integer, String> biFunc1 = String::substring;

Примеры:

String s1 = "abcde";
Function<Integer,String> func1 = s1::substring;
String sub1 = func1.apply(3); // always applied on the same String

BiFunction<String, Integer, String> biFunc1 = String::substring;
String sub2 = biFunc1.apply(s1,3); // applied on whichever String you supply
...