Примеры использования лямбда выражений

Пример 1, описание оформления списка

Сделаем функцию printList, которая печатает построчно содержимое числового списка, при этом как печатать число указано с помощью функции (лямбда-выражения):

List<Integer> ints = List.of(3, 5, 6);
printList(ints, x -> "!" + x);

Результатом должно быть:

!3
!5
!6

А printList(ints, x -> "*".repeat(x)) выведет:

***
*****
******

Реализация:

public interface NumbersDisplayer {
     String display(int x);
}

public class ListPrinter {
     public static void main(String[] args) {
          List<Integer> ints = List.of(3, 5, 6);
          printList(ints, x -> "!" + x);
          printList(ints, x -> "*".repeat(x));
          //аналогично предыдущему, но здесь
          //метод repeat объекта "*" преобразован в лямбда-варажение
          printList(ints, "*"::repeat);
     }

     private static void printList(List<Integer> ints, NumbersDisplayer nd) {
          for (int i : ints)
               System.out.println(nd.display(i));
     }

     // Часто можно не создавать свой интерфейс, а пользоваться одним из существующих
     private static void printList2(List<Integer> ints, Function<Integer, String> nd) {
          for (int i : ints)
               System.out.println(nd.apply(i));
     }
}

Сортировка массивов (списков)

Если у вас есть массив или список каких-то объектов, которые сравниваются особым образом, чтобы отсортировать такой массив или список, необходимо понятие компаратора (сравнивателя), он по двум объектам говорит, какой из них больше. По-умолчанию, в Java при сортировке строк они сравниваются по алфавиту, т.е. сначала по первой букве, потом по второй и т.д. Если хочется сравнивать строки по длине, нужен компаратор именно для такого сравнения.

Компаратор — это объект с методом compare: int compare(String s1, String s2), получает два объекта, возвращает 0 — означает равенство объектов. Положительное число — первый больше, отрицательное — первый меньше.

class SortExamples {
    public static void main(String[] args) {
        List<Integer> list1 = List.of(40, 10, 30, 50, 24);
        list1.
    }
}

Графический интерфейс в Java

Интерфейс с окнами, кнопками, другими элементами управления. Большинство программ с интерфейсом сейчас разрабывается для web. Т.е. это HTML/CSS/JS. Кроме этого интерфейсы делаются для мобильных платформ Android, iOS. А для десктопа интерфейсы делают редко. И Java не самый популярный язык для создания таких интерфейсов. Но, Java удобна для этой цели, имеет хорошую современную библиотеку JavaFX. Концептуально она похожа и на Web (имеет язык FXML ~ HTML, CSS), и на Android.

Ранее в Java были библиотеки AWT, ее заменила Swing. Самый известный пример Swing-приложения — это IntelliJ IDEA. Но вообще на Swing не очень просто делать интерфейсы с нестандартными элементами. Сейчас всё это заменила JavaFX, хотя Swing будет поддерживаться и дальше, Swing включен в Java SDK.

До Java 1.8 JavaFX тоже входила в SDK, сейчас это отдельная библиотека, ее нужно отдельно скачивать, подключать к проекту.

Внешний вид приложений JavaFX, Swing, AWT. Эти фреймворки сами рисуют интерфейс. Внешний вид, например, кнопки полностью создаётся библиотекой. Преимущества: - программы выглядят одинаково независимо от платформы, где запущены. Недостаток: 1) пользователю непривычный вид интерфейса может казаться чуждым. 2) это медленнее, чем если пользоваться встроенными в операционную систему элементами интерфейса. Если очень нужно, можно настраивать внешний вид элементов интерфрейса и делать его похожим на Windows, IOS, …

Установка библиотеки. https://openjfx.io Нужно скачать zip архив, распаковать в какое-то место, где вы его найдете. Если это каталог проекта, добавьте в .gitignore Настраиваем проект, выбираем меню File -> Project Structure -> добавляем папку lib как библиотеку. Добавляем в проект в самый корень (каталог src) файл module-info.java:

module ru.spbu.arts.javafx {
    requires javafx.base; // другие модули, которые используем
    requires javafx.graphics;
    requires javafx.controls;

    //разрешаем библиотеке javafx исследовать содержимое нашего пакета с кодом
    opens ru.spbu.arts.javafx;
}

Минимальный пример программы JavaFXExample