Java 8 Ссылки на методы
Данная статья написана командой Vertex Academy. Это одна из статей из нашего Учебника по Java 8. Надеемся, что данная статья Вам будет полезна. Приятного прочтения!
В этой статье мы рассмотрим ссылки на методы в Java 8
1. Введение
С приходом Java 8 стало возможным писать код в декларативном стиле с помощью ссылок на методы. По сути, это та же лямбда, только круче 🙂
Для использования необходимо написать оператор ::
2. forEach
Ссылки на методы позволяют упростить код
1 2 3 4 |
public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.forEach(number -> System.out.println(number)); } |
до следующего
1 2 3 4 |
public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); numbers.forEach(System.out::println); } |
Работают ссылки на методы при условии, что параметры вызываемого метода и параметры в лямбде совпадают.
3. Function
Cобственный метод и лямбда
1 2 3 4 5 6 7 8 9 10 |
public class MainClass { public static void main(String[] args) { Function<String, Integer> toInteger = string -> parse(string); Integer integer = toInteger.apply("5"); } private static Integer parse(String s) { return Integer.parseInt(s); } } |
Cобственный метод и ссылка на метод
1 2 3 4 5 6 7 8 9 10 |
public class MainClass { public static void main(String[] args) { Function<String, Integer> toInteger = MainClass::parse; Integer integer = toInteger.apply("5"); } private static Integer parse(String s) { return Integer.parseInt(s); } } |
4. Конструкторы
Помимо методов, так же можно передавать ссылки на конструкторы.
Для этого создадим класс User
1 2 3 4 5 6 7 8 |
class User { String name, surname; User(String name, String surname) { this.name = name; this.surname = surname; } } |
и интерфейс UserFactory
1 2 3 |
interface UserFactory { User create(String name, String surname); } |
Теперь же, вместо реализации интерфейса используем ссылку на конструктор User
1 2 3 4 |
public static void main(String[] args) { UserFactory userFactory = User::new; User user = userFactory.create("John", "Snow"); } |
5. Больше примеров
5.1 Function composition
Ссылки на методы смотрятся еще лучше при цепочке обращений.
1 2 3 4 5 6 7 8 9 10 11 |
public static void main(String[] args) { Function<String, String> trim = String::trim; String str = trim .andThen(String::toLowerCase) .andThen(StringBuilder::new) .andThen(StringBuilder::reverse) .andThen(StringBuilder::toString) .apply(" ABCDEFG "); // Output gfedcba } |
Где мы сначала декларативно описываем необходимые действия, и уже после вызываем всю цепочку.
5.2 Comparator
Создадим класс User
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
class User { private String name, surname; public User(String name, String surname) { this.name = name; this.surname = surname; } public String getName() { return name; } public String getSurname() { return surname; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", surname='" + surname + '\'' + '}'; } } |
И тепер вывести отсортированный список не составляет труда (и кода)
1 2 3 4 5 6 7 8 9 |
public static void main(String[] args) { List<User> users = new ArrayList<>(); users.add(new User("Nick", "Boll")); users.add(new User("Jan", "Nicky")); users.add(new User("Bot", "Smart")); users.sort(Comparator.comparing(User::getName)); users.forEach(System.out::println); } |
Где мы отсортировали список по имени
Вывод
1 2 3 |
User{name='Bot', surname='Smart'} User{name='Jan', surname='Nicky'} User{name='Nick', surname='Boll'} |
Надеемся, что наша статья была Вам полезна. Также есть возможность записаться на наши курсы по Java в Киеве. Детальную информацию Вы можете найти у нас на сайте.