C# - pattern matching - many discards
сорри за возможно глупый вопрос: но вот это разве не делегаты?
Вот кстати да, как уточняет AlexNek, было бы неплохо определиться, а что мы вообще делегатами называем.
Для меня делегат это "переменная-метод". Которую можно использовать как метод.
Т.е. чтобы можно было сделать так:
Function<Integer, Double> half = a -> a /2.0; // Applying the function to get the result System.out.println(half(10));
В яве так сделать нельзя.
И этот "конструкт" должен быть "first-class citizen". Выполнять все 4 требования. В яве ссылки нa методы нельзя сравнивать. Не работает.
import java.util.function.Function; public class MyClass { public static String value(int i) { return "Value: " + i; } public static void main(String args[]) { Function<Integer, String> f1 = MyClass::value; Function<Integer, String> f2 = MyClass::value; System.out.println("Same method? : " + f1.equals(f2)); } }
Вернёт false.
Function<Integer, Double> half = a -> a /
2.0
;
компилятором превращается в
Function<Integer, Double> half = new Function<Integer, Double>() { @Override public Double apply(Integer t) { return t / 2.0; } }
Новый класс. Сделали ещё раз то же самое, получили ещё один новый класс. То же и с ссылками,
из Function<Integer, String> f1 = MyClass::value; получается
Function<Integer, String> f1 = new Function<Integer, String>() { @Override public String apply(Integer t) { return MyClass.value(t); } }
Два раза использовали ссылку, получили два класса. Сравниваешь их, а они не равны. Что правильно, это же разные классы. А вот логично было бы иметь возможность писать f1 == f2 и получать true. Если б это были и правда ссылки на методы. Вот такая фигня, малята.