Java 8 Lambda
Данная статья написана командой Vertex Academy. Это одна из статей из нашего Учебника по Java 8. Надеемся, что данная статья Вам будет полезна. Приятного прочтения!
В этой статье мы рассмотрим лямбда-выражения на примере интерфейса Comparator.
1. Сортировка без лямбд
До выхода Java 8 для сортировки коллекций нам необходимо было создавать анонимный внутренний класс для Comparator.
1 2 3 4 5 6 |
new Comparator<User>() { @Override public int compare(User o1, User o2) { return o1.getAge() - o2.getAge(); } } |
Послее передать его в Collections.sort вместе с коллекцией.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public static void main(String[] args) { List<User> users = Arrays.asList( new User("John", 28), new User("Jane", 35), new User("Alex", 21)); System.out.println("Before sort:"); for (User user : users) { System.out.println(user); } Collections.sort(users, new Comparator<User>() { @Override public int compare(User o1, User o2) { return o1.getAge() - o2.getAge(); } }); System.out.println("\nAfter sort:"); for (User user : users) { System.out.println(user); } } |
Результат:
1 2 3 4 5 6 7 8 9 |
Before sort: User{name='John', age=28} User{name='Jane', age=35} User{name='Alex', age=21} After sort: User{name='Alex', age=21} User{name='John', age=28} User{name='Jane', age=35} |
2. Сортировка с использованием лямбд
С приходом Java 8 мы можем заменить создание анонимного наследника класса на лямбда-выражение:
1 |
(User o1, User o2) -> o1.getAge() - o2.getAge() |
что значительно короче чем предыдущий вариант.
Так же, мы можем упустить обозначение типов o1 и o2, сократив код до:
1 |
(o1, o2) -> o1.getAge() - o2.getAge() |
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public static void main(String[] args) { List<User> users = Arrays.asList( new User("John", 28), new User("Jane", 35), new User("Alex", 21)); System.out.println("Before sort:"); for (User user : users) { System.out.println(user); } Collections.sort(users, (o1, o2) -> o1.getAge() - o2.getAge()); System.out.println("\nAfter sort:"); for (User user : users) { System.out.println(user); } |
Результат:
1 2 3 4 5 6 7 8 9 |
Before sort: User{name='John', age=28} User{name='Jane', age=35} User{name='Alex', age=21} After sort: User{name='Alex', age=21} User{name='John', age=28} User{name='Jane', age=35} |
3. List.sort()
В Java 8 в интерфейс List добавили метод sort, что позволяет использовать вместо
1 |
Collections.sort(users, (o1, o2) -> o1.getAge() - o2.getAge()); |
следующее выражение
1 |
users.sort((o1, o2) -> o1.getAge() - o2.getAge()); |
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public static void main(String[] args) { List<User> users = Arrays.asList( new User("John", 28), new User("Jane", 35), new User("Alex", 21)); System.out.println("Before sort:"); for (User user : users) { System.out.println(user); } users.sort((o1, o2) -> o1.getAge() - o2.getAge()); System.out.println("\nAfter sort:"); for (User user : users) { System.out.println(user); } } |
Результат:
1 2 3 4 5 6 7 8 9 |
Before sort: User{name='John', age=28} User{name='Jane', age=35} User{name='Alex', age=21} After sort: User{name='Alex', age=21} User{name='John', age=28} User{name='Jane', age=35} |
4. Сортировка в обратном направлении
С приходом Java 8 сортировка в обратном направлении стала еще легче. Ведь изменять уже созданные Comparator-ы не нужно.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public static void main(String[] args) { List<User> users = Arrays.asList( new User("John", 28), new User("Jane", 35), new User("Alex", 21)); System.out.println("Before sort:"); for (User user : users) { System.out.println(user); } Comparator<User> comparator = (o1, o2) -> o1.getAge() - o2.getAge(); users.sort(comparator.reversed()); System.out.println("\nAfter sort:"); for (User user : users) { System.out.println(user); } } |
Результат:
1 2 3 4 5 6 7 8 9 |
Before sort: User{name='John', age=28} User{name='Jane', age=35} User{name='Alex', age=21} After sort: User{name='Jane', age=35} User{name='John', age=28} User{name='Alex', age=21} |
5. Больше примеров с лямбдами
5.1 Сортировка по имени
До Java 8:
1 2 3 4 5 6 |
Collections.sort(users, new Comparator<User>() { @Override public int compare(User o1, User o2) { return o1.getName().compareTo(o2.getName()); } }); |
Сейчас:
1 |
users.sort((o1, o2) -> o1.getName().compareTo(o2.getName())); |
Результат:
1 2 3 |
User{name='Alex', age=21} User{name='Jane', age=35} User{name='John', age=28} |
5.2 Обратная сортировка по имени
До Java 8:
1 2 3 4 5 6 |
Collections.sort(users, new Comparator<User>() { @Override public int compare(User o1, User o2) { return o2.getName().compareTo(o1.getName()); } }); |
Сейчас:
1 2 |
Comparator<User> c = (o1, o2) -> o1.getName().compareTo(o2.getName()); users.sort(c.reversed()); |
При этом сам Comparator остается неизмененным.
Результат:
1 2 3 |
User{name='John', age=28} User{name='Jane', age=35} User{name='Alex', age=21} |
5.3 Сортировка с несколькими условиями
До Java 8:
1 2 3 4 5 6 7 8 |
Collections.sort(users, new Comparator<User>() { @Override public int compare(User o1, User o2) { if (o1.getAge() == o2.getAge()) return o1.getName().compareTo(o2.getName()); else return o1.getAge() - o2.getAge(); } }); |
Сейчас:
1 2 3 4 5 |
users.sort((o1, o2) -> { if (o1.getAge() == o2.getAge()) return o1.getName().compareTo(o2.getName()); else return o1.getAge() - o2.getAge(); }); |
Результат:
1 2 3 |
User{name='John', age=28} User{name='Jane', age=35} User{name='Alex', age=21} |
Записывайтесь к нам на курсы. Дательнее у нас на сайте.