Что “Снимает Лямбда”?

В версии java 1.5 вводится общее программирование. Прежде всего, что общего в java? Общее программирование - это безопасный объект типа. Перед общим набором в коллекции мы можем хранить любой тип объекта. и после генерации мы должны хранить данные определенного типа объекта.

В чем преимущества Generic? Основными преимуществами родового является то, что литье по типу не требуется, а также тип-мудрец и Generic будут проверять время компиляции. и общий синтаксис Generic - это ClassOrInterface здесь type - это сигнал, который этот класс мог бы установить для класса при его создании

Пример . GenericClassDemo

genericclassDemo = новый GenericClassDemo (Employee.java)

38
задан Daniel LeCheminant 26 February 2009 в 21:50
поделиться

4 ответа

Лямбда, поднимающаяся, является техникой для 'снимания' лямбд к более высокому уровню (главным образом к верхнему уровню).

Doug Currie описывает, почему Вы хотели бы сделать это.

Вот некоторый пример кода (в JavaScript) того, как Вы могли сделать это вручную:

function addFive(nr)
{
  var x = 5;
  function addX(y)
  {
    return x + y;
  }

  return addX(nr);
}

Теперь, если Вы не хотите этот addX функция в определении addFive, Вы могли бы 'снять' его к верхнему уровню как так:

function addX(y)
{
  return x + y;
}

function addFive(nr)
{
  var x = 5;

  return addX(nr);
}

Однако это не будет работать, начиная с x переменная больше не доступна в контексте эти addX функция. Способ зафиксировать это состоит в том, чтобы добавить дополнительный формальный параметр к функции:

function addX(y, x)
{
  return x + y;
}

function addFive(nr)
{
  var x = 5;

  return addX(nr, x);
}
<час>

Дополнение: Вот является очень изобретенный пример лямбды 'выходом'. Где Вы не будете в состоянии сделать лямбду, поднимающуюся так же легко, как я описал.

function getAddFiveFunc()
{
  var x = 5;
  function addX(y)
  {
    return x + y;
  }

  return addX;
}

Теперь, если кто-то звонит эти getAddFiveFunc функция, они вернут функцию. Эта функция могла использоваться во всех видах мест, Теперь, если Вы действительно хотите подняться эти addX функция, необходимо будет обновить все те callsites.

39
ответ дан Svante 10 October 2019 в 07:04
поделиться

Предупреждение: Мой ответ на самом деле описывает полученные переменные, который отличается, чем подъем лямбды. Неправильно читайте вопрос (должны будьте спать). Но я провел немного времени, описывая это так, я, ненавидят для удаления его. Оставленный на виду это как общественная WIKI.

подъем Лямбды, часто называемый закрытиями, является способом бесшовного предоставления доступа в переменных объема из вложенного лямбда-выражения.

трудно войти во вшивые песчаные детали закрытий, не выбирая конкретный язык. Один из побочных эффектов подъема лямбды, на любом языке, то, что он имеет тенденцию расширять время жизни переменной от локального, недолгого объема к намного дольше объему, которым живут. Обычно это происходит в форме передачи переменной от стека до "кучи" в рамках компилятора. Это очень язык определенное действие и поэтому производит совсем другие реализации на основе языка.

я сфокусируюсь на C#, так как это - вероятно, язык, наиболее характерный для читателей переполнения стека. Позволяет запускаются со следующего кода.

public Func<int> GetAFunction() {
  var x = 42;
  Func<int> lambda1 = () => x;
  Func<int> lambda2 = () => 42;
  ...
  return lambda1;
}

В этом примере мы создали 2 лямбда-выражения. В обоих случаях это присвоено экземпляру делегата типа Func. Все делегаты в .NET требуют, чтобы реальная функция поддержала их где-нибудь. Таким образом под капотом, все лямбда-выражения / анонимные функции в C# переводятся в определение метода.

Генерация функции для lambda2 является довольно прямой. Это - изолированная функция, которая просто возвращает постоянную величину.

public static int RealLambda2() { 
  return 42;
}

Генерация lambda1 вполне немного более трудна. Литеральное определение было бы похоже на следующий

public static int RealLambda1() {
  return x;
}

, Это, очевидно, не скомпилирует, потому что x не доступен. Для создания этой работы компилятор C# должен лифт переменная x в закрытие. Это может тогда возвратить указатель на функцию в рамках закрытия для удовлетворения выражения

class Closure1 {
  int x;
  public int RealLambda1() {
    return x;
  }
}

делегата, Это - довольно простой пример, но должно, надо надеяться, детализировать искусство подъема. Дьявол находится, к сожалению, в деталях и становится намного более сложным со сценарием.

1
ответ дан 3 revs, 2 users 99% 10 October 2019 в 07:04
поделиться

Лямбда, поднимающаяся, используется для превращения закрытия в чистую функцию. Путем передачи дополнительных аргументов функции Вы сокращаете количество ее свободных переменных. Поскольку Вы "снимаете" лямбду в выше и более высокие объемы, Вы добавляете аргументы для размещения локальных переменных, объявленных в том объеме (который был бы свободными переменными иначе). Как только лямбда не имеет никаких свободных переменных, это - чистая "высокоуровневая" функция.

, Конечно, можно только сделать это, если Вы знаете сайты вызова всей лямбды; другими словами, только если лямбда не выходит.

преимущество в оптимизаторе компилятора - то, что закрытия (функциональные среды) могут быть устранены. Это могло бы позволить передать аргументы в регистрах, а не стеке (или "куча") выделение их как свободные переменные.

49
ответ дан Doug Currie 10 October 2019 в 07:04
поделиться

лямбда, поднимающаяся в основном, устраняет переменные и помещает их в чистые функции, упрощая выполнение.

0
ответ дан Jon W 10 October 2019 в 07:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: