Squeak.ru - шаблоны программирования

Java: проблема с объявлением локальной переменной лямбда

Я следую примеру в ответе на JavaFX TableView Sort Policy, чтобы сделать свой собственный компаратор, но лямбда-выражения для меня новы, и мне трудно понять, что происходит.

То, что работает, уродливо:

    elementsTable.sortPolicyProperty().set(t -> {
        Comparator<Row> comparator = (r1, r2)
            -> of.wrap.els.getElement(toZ(r1.getSymbol())).getZ() > 
                    of.wrap.els.getElement(toZ(r2.getSymbol())).getZ() ? 1
            : of.wrap.els.getElement(toZ(r1.getSymbol())).getZ() < 
                    of.wrap.els.getElement(toZ(r2.getSymbol())).getZ() ? -1
            : of.wrap.els.getElement(toZ(r1.getSymbol())).getZ() == 
                    of.wrap.els.getElement(toZ(r2.getSymbol())).getZ() ? 0
            : t.getComparator() == null ? 0 //no column sorted: don't change order
            : t.getComparator().compare(r1, r2); //columns are sorted: sort accordingly
            FXCollections.sort(elementsTable.getItems(), comparator);
        return true;
    });

Но если я попытаюсь

    int n1,n2;
    elementsTable.sortPolicyProperty().set(t -> {
        Comparator<Row> comparator = (r1, r2)
            ->
            n1 = of.wrap.els.getElement(toZ(r1.getSymbol())).getZ();
            n2 = of.wrap.els.getElement(toZ(r2.getSymbol())).getZ();
            n1 > n2 ? 1
            : n1 < n2 ? -1
            : n1 == n2 ? 0
            : t.getComparator() == null ? 0 //no column sorted: don't change order
            : t.getComparator().compare(r1, r2); //columns are sorted: sort accordingly
            FXCollections.sort(elementsTable.getItems(), comparator);
        return true;
    });

NetBeans указывает, что r2 не используется в компараторе, и все экземпляры r1 и r2 помечены как неопределенные в области действия, за исключением первого r1 как части n1.

Если я попытаюсь объявить n1, n2 внутри как int, это даст «ожидаемый '.class'» или -> станет недопустимым началом выражения, если оно окончательное.

Каков правильный способ сделать то, что я пытаюсь?

30.07.2015

  • нужно {} (params)->{ statements } 30.07.2015

Ответы:


1

Вы не можете назначать переменные вне области действия лямбда-выражения, и вам нужно поместить несколько операторов в скобки:

elementsTable.sortPolicyProperty().set(t -> {
    Comparator<Row> comparator = (r1, r2) -> {
        int n1 = of.wrap.els.getElement(toZ(r1.getSymbol())).getZ();
        int n2 = of.wrap.els.getElement(toZ(r2.getSymbol())).getZ();
        return n1 > n2 ? 1
        : n1 < n2 ? -1
        : n1 == n2 ? 0
        : t.getComparator() == null ? 0 //no column sorted: don't change order
        : t.getComparator().compare(r1, r2); //columns are sorted: sort accordingly
        };
        FXCollections.sort(elementsTable.getItems(), comparator);
    return true;
});

Вы можете избежать безумной вложенности, сделав компаратор константой вне внешней лямбды. Также обратите внимание, что последние два : t.getComparator()... никогда не будут достигнуты.

30.07.2015
  • Я взял их из примера, не был уверен, как они когда-нибудь будут, но оставил их. Есть ли ресурс, на который вы можете мне указать, который объясняет внутренний возврат? 30.07.2015
  • Мне нужно найти один, но, как правило, вы можете представить скобки как скобки тела метода, в котором вам также нужен оператор возврата. 30.07.2015
  • Спасибо, этот ответ очень помог мне понять это и реализовать компараторы для нескольких других объектов, а также без упомянутого безумного вложения. 31.07.2015
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...