Я не буду написать синтаксисную часть, давайте просто подням практический вопрос, чтобы увидеть, какие удобства могут принести нам новые функции Java8.
Кстати, используется некоторое общее программирование, все для упрощения кода
Сцена:
Класс данных, который записывает информацию о сотруднике
Работник открытого класса {public String name; Public Int Age; Общественный пол Секс; Public String Time; Public int зарплата;}У нас есть столбец такого типа данных
Список <Сотрудник> data = arrays.aslist (e1, e2, e3 ......)
Сейчас есть необходимость: работники группы сотрудников по первоначальному письму их имен (при условии, что они все английские имена):
Тогда результатом, который мы хотим получить, должен быть отношение к отображению, например, Map:char -> List<Employee>
Общественная статическая карта <символ, список <Сотрудник >> GroupByfirstchar (List <Speakeee> data) {map <символ, список <Сотрудник >> result = new Hashmap <> (); для (сотрудник E: DATA) {символ C = e.name.charat (0); Список <Сотрудник> l = result.get (c); if (l == null) {l = new ArrayList <> (); result.put (c, l); } l.Add (e); } return Result;}Код не сложный и может быть завершен в ближайшее время. Босс видит, что вы настолько эффективны, поэтому он сказал, что вы разделите его на группы в соответствии с вашей зарплатой, для тех, кто ниже 5000, 5000 ~ 10 000 ... и т. Д.
Это не будет слишком сложно, просто измените ключ и обработайте его немного логически
Public Static Map <String, List <employtee >> GroupBysalary (List <memplieee> data) {map <string, list <employtee >> result = new hashmap <> (); Для (сотрудника E: data) {String Key = отдельный (e.salary); Список <Сотрудник> l = result.get (key); if (l == null) {l = new ArrayList <> (); result.put (key, l); } l.Add (e); } return result; <br>} частная статическая строка отдельно (int заработная плата) {if (зарплата <= 5000) {return "менее 5000"; } if (зарплата <= 10000) {return "5000 ~ 10000"; } if (зарплата <= 20000) {return "10000 ~ 20000"; } вернуть "выше 20000"}Затем начальник снова сказал, давайте разделим сотрудников на группы в соответствии с годом работы. Полем Полем
Я не буду написать код здесь. Если вы сравните это, вы обнаружите, что независимо от того, как вы его группируете, единственное изменение - это способ выбрать значение ключа.
Первая буква имени сотрудника используется в качестве ключа впервые:
Сотрудник e -> e.name.charat (0)
Во второй раз, когда я преобразовываю зарплату сотрудника в строку в качестве ключа в соответствии с методом разделяет:
Сотрудник E -> отдельный (e.salary): строка
И так далее
Сотрудник E -> getyear (E.Time): строка
На самом деле, в первый раз вы также можете написать первую букву в один метод.
Сотрудник E -> GetFirstchar (e.name): символ
Чтобы выглядеть красивее, мы можем сказать, что параметры трех методов установлены для сотрудников. Тело метода не написано. Здесь перечислены только параметры и возвращаемые значения.
Сотрудник e -> getFirstchar (e): exaturalEmployee e -> secret (e): stringeMployee e -> getyear (e): строка
Левая сторона -> -параметр, правая сторона: -это возвратное значение, а правая сторона -> -подпись метода
Затем мы, естественно, будем думать об извлечении измененной части в качестве параметров и других неизменных частей в качестве методов тел, чтобы мы могли опустить дубликат кода. Очевидно, что измененная часть - это метод, перечисленный выше, который преобразует сотрудников в ключ, но мы знаем, что Java не может передавать методы в качестве параметров. Тем не менее, это не проблема для программистов с небольшим опытом. Мы можем использовать интерфейсы для достижения наших целей, и в то же время мы столкнемся с другой проблемой. Возвратные значения приведенных выше трех методов различны, поэтому нам нужно использовать дженерики:
public static <k> map <K, list <employtee >> GroupBykey (список <Сотрудник> Данные, getKey <K> getKey) {map <K, list <employee >> result = new hashmap <> (); для (сотрудник E: Data) {k Key = getKey.getKey (e); Список <Сотрудник> l = result.get (key); if (l == null) {l = new ArrayList <> (); result.put (key, l); } l.Add (e); } return result;} интерфейс getKey <k> {k getKey (сотрудник E);}Тогда первое требование, выше, может быть реализовано таким образом
Map <символ, список <Сотрудник >> result = GroupBykey (data, new GetKey <Harment> () {@Override public gateke getKey (employee e) {e.name.charat (0);}});Второе требование
Map <string, list <employee >> result = GroupBykey (список, новый getKey <string> () {@Override public String getKey (сотрудник e) {отдельный (e.salary);}});Можно обнаружить, что нам нужно только изменить общие параметры и реализацию анонимных внутренних классов. Единственная проблема заключается в том, что это не очень реалистично, и многие обычные коды особенно отражаются в анонимных внутренних классах.
Фактически, мы заботимся только о параметрах и возвратных значениях этого анонимного внутреннего класса, а остальные являются просто синтаксическими требованиями.
Java8 просто предоставляет нам хороший способ избежать сложных процедур: выражения Lambda, приведенная выше реализация может быть написана как
Map <символ, список <Сотрудник >> resultbyfirstchar = GroupBykey (list, e -> e.name.charat (0)); map <string, list <employtee >> resultbysalary = GroupBykey (список, e -> отдельный (e.salary));
Выражения Lambda показывают только то, что нас волнует, параметры и возвращаемые значения. В то же время, из -за вывода типа, типы параметров могут быть опущены. Конкретный синтаксис не будет представлен здесь. Много информации можно найти в Интернете
дополнительный:
Если у вас хорошее понимание дженериков, метод GroupBykey может быть дополнительно абстрагирована:
public static <K, e> map <K, list <e >> Groupby (list <? Extends E> Data, function <? Super e ,? extends k> развлечение) {map <k, list <e >> result = new Hashmap <> (); для (e e: data) {k k = fun.apply (e); <br> list <e> l = result.get (k); if (l == null) {l = new ArrayList <> (); result.put (k, l); } l.Add (e); } return result; <br>}Мы также извлекли класс сотрудников, и преимущества очевидны
Функциональный интерфейс - это недавно добавленный интерфейс к Java8:
@FunctionalInterfacepubbublic function <t, r> {r Apply (t t);}Введите тип T, чтобы вернуться к типу R. Сочетание дженериков и функционального программирования очень хорошее. Хотя новые особенности Java8 подвергались критике по различным видам жалоб, всегда полезно приносить преимущества, что дает нам больше вариантов.
Если у вас есть время, я представлю потоки, еще один отличный инструмент для Java8
Выше применение выражений Lambda в Java 8 и некоторых общих знаний, представленных вам редактором. Я надеюсь, что это будет полезно для вас. Если у вас есть какие -либо вопросы, пожалуйста, оставьте мне сообщение, и редактор ответит вам вовремя. Большое спасибо за вашу поддержку сайту wulin.com!