Java 8 позволяет использовать одно и то же лямбда-выражение в разных контекстах. Рассмотрим следующий код, который демонстрирует это:Повторное использование лямбда-выражений в Java 8
public class LambdasTypeCheck {
public static void main(String []args) {
//Same lambda expression can be used in different contexts.
Predicate<List<String>> predicate = (l) -> l.add("1");
Consumer<List<String>> consumer = (l) -> l.add("1");
}
}
Выражение лямбда (l) -> l.add("1");
дублируется в двух местах. Как я могу избежать этого дублирования? Один из способов повторного использования этого выражения лямбда заключается в том, что есть некоторый интерфейс/класс, который является родителем всех лямбда-выражений, так что я могу назначить любое лямбда-выражение ссылке такого интерфейса/класса.
У вас есть сценарий реальной жизни, в котором одно и то же лямбда-выражение может быть назначено различным функциональным интерфейсам? Пример, который вы дали, имеет мало смысла. '(l) -> l.add (" 1 ")' не следует использовать в качестве предиката. – Eran
На данный момент я этого не делаю. Означает ли это, что мне не должно быть любопытно? Я хочу знать, можно ли это сделать, а не делать это.Кроме того, этот пример предназначен только для поддержки моего вопроса, а не того, что я использую в реальном мире. – CKing
Хотя эти два лямбда-выражения выглядят одинаково, они не то же самое. Их целевые типы совершенно разные, и поэтому это их намерение. Я полагаю, что предикат лямбда довольно плох, так как он имеет побочные эффекты. Чтобы сохранить ссылочную прозрачность, это должно быть 'l :: contains' –