C: поведение унарного минуса с неподписанными операндами

Анонимные внутренние классы фактически закрывают, поэтому их можно использовать для эмуляции лямбда-выражений или «делегатов». Например, возьмите этот интерфейс:

public interface F {
   B f(A a);
}

Вы можете использовать это анонимно, чтобы создать функцию первого класса в Java. Допустим, у вас есть следующий метод, который возвращает первое число, большее, чем i в данном списке, или i, если число не больше:

public static int larger(final List ns, final int i) {
  for (Integer n : ns)
     if (n > i)
        return n;
  return i;
}

И у вас есть другой метод, который возвращает первый номер меньшего размера чем i в данном списке, или i, если число меньше:

public static int smaller(final List ns, final int i) {
   for (Integer n : ns)
      if (n < i)
         return n;
   return i;
}

Эти методы почти идентичны. Используя первоклассный тип функции F, мы можем переписать их в один метод следующим образом:

public static  T firstMatch(final List ts, final F f, T z) {
   for (T t : ts)
      if (f.f(t))
         return t;
   return z;
}

Вы можете использовать анонимный класс для использования метода firstMatch:

F greaterThanTen = new F {
   Boolean f(final Integer n) {
      return n > 10;
   }
};
int moreThanMyFingersCanCount = firstMatch(xs, greaterThanTen, x);

Это действительно надуманный пример, но его легко увидеть, что возможность передавать функции вокруг, как если бы они были значениями, является довольно полезной функцией. См. «Может ли ваш язык программирования делать это» самим Джоэлем.

Хорошая библиотека для программирования Java в этом стиле: Функциональная Java.

30
задан Community 23 May 2017 в 10:29
поделиться