Список часто используемых лямбда-выражений — операция с одним списком
Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность
Эта статья также участвуетПроект «Звезда раскопок», чтобы выиграть творческие подарочные наборы и бросить вызов творческим поощрениям
введение
После использования JDK1.8 большинство операций со списками можно писать с использованием лямбда-выражений, что может сделать код более кратким и ускорить разработку. Ниже приведены общие операции лямбда-выражений со списками, которые я обычно использую в своей работе, и мне нравится предлагать коллекции.
Взяв за пример таблицу пользователей, код сущности пользователя выглядит следующим образом:
public class User {
private Integer id; //id
private String name; //姓名
private Integer age; //年龄
private Integer departId; //所属部门id
}
List<User> list = new ArrayList<>();
простой обход
Прежде чем использовать лямбда-выражения, если вам нужно просмотреть список, вы обычно используете расширенный цикл for.Код выглядит следующим образом:
List<User> list = new ArrayList<>();
for (User u:list) {
System.out.println(u.toString());
}
После использования лямбда-выражения его можно сократить до одной строки кода:
list.forEach(u-> System.out.println(u.toString()));
Коллекции списка фильтров, соответствующие определенному условию атрибута
Взяв в качестве примера фильтрацию пользователей в возрасте от 15 до 17 лет, цикл for записывается так:
List<User> users = new ArrayList<>();
for (User u : list) {
if (u.getAge() >= 15 && u.getAge() <= 17) {
users.add(u);
}
}
Лямбда-выражение записывается так:
List<User> users = list.stream()
.filter(u -> u.getAge() >= 15 && u.getAge() <= 17)
.collect(Collectors.toList());
Получить свойство и вернуть новую коллекцию List
Взяв в качестве примера получение идентификатора, иногда в проекте может потребоваться запрос или пакетные операции обновления на основе списка идентификаторов пользователей. В этом случае требуется коллекция списка идентификаторов пользователей. Цикл for записывается как :
List<Integer> ids = new ArrayList<>();
for (User u:list) {
ids.add(u.getId());
}
Лямбда-выражение записывается так:
List<Integer> ids = list.stream()
.map(User::getId).collect(Collectors.toList());
Получить коллекцию Map с атрибутом в качестве ключа и другими атрибутами или соответствующим объектом в качестве значения
Используйте идентификатор пользователя в качестве ключа (иногда может быть необходимо использовать номер пользователя в качестве ключа) и используйте пользователя, соответствующего идентификатору, в качестве значения для построения набора карт.Цикл for записывается как:
Map<Integer,User> userMap = new HashMap<>();
for (User u:list) {
if (!userMap.containsKey(u.getId())){
userMap.put(u.getId(),u);
}
}
Лямбда-выражение записывается так:
Map<Integer,User> map = list.stream()
.collect(Collectors.toMap(User::getId,
Function.identity(),
(m1,m2)->m1));
Function.identity() возвращает объект лямбда-выражения с тем же выходом, что и вход, что эквивалентно лямбда-выражению формы t -> t.
(m1,m2)->m1 здесь означает, что если в процессе преобразования карты в списке есть два объекта с одинаковым id, первый объект сохраняется в карте, и вы можете написать его самостоятельно в соответствии с потребностями проект.
Коллекция карт, сгруппированных по атрибуту
Взяв в качестве примера идентификатор отдела, иногда необходимо сгруппировать по отделу, чтобы отфильтровать персонал в разных отделах.Если используется цикл for, он записывается как:
Map<Integer,List<User>> departGroupMap = new HashMap<>();
for (User u:list) {
if (departGroupMap.containsKey(u.getDepartId())){
departGroupMap.get(u.getDepartId()).add(u);
}else {
List<User> users1 = new ArrayList<>();
users1.add(u);
departGroupMap.put(u.getDepartId(),users1);
}
}
Лямбда-выражение записывается так:
Map<Integer,List<User>> departGroupMap = list.stream()
.collect(Collectors
.groupingBy(User::getDepartId));
Другие случаи
Вы можете комбинировать stream() для выполнения нескольких операций по мере необходимости, таких как фильтрация пользователей в возрасте 15–17 лет и группировка их по отделам.Если вы используете цикл for, код выглядит следующим образом:
Map<Integer,List<User>> departGroupMap = new HashMap<>();
for (User u:list) {
if (u.getAge() >= 15 && u.getAge() <= 17) {
if (departGroupMap.containsKey(u.getDepartId())){
departGroupMap.get(u.getDepartId()).add(u);
}else {
List<User> users1 = new ArrayList<>();
users1.add(u);
departGroupMap.put(u.getDepartId(),users1);
}
}
}
Используя лямбда-выражения, код выглядит следующим образом:
Map<Integer,List<User>> departGroupMap = list.stream()
.filter(u->u.getAge() >= 15 && u.getAge() <= 17)
.collect(Collectors.groupingBy(User::getDepartId));
Суммировать
Вышеупомянутая часть представляет собой операцию с одним списком, который обычно используется редактором в моей работе. В проекте могут быть более сложные сценарии. При необходимости вы можете использовать комбинацию нескольких методов. Я чувствую, что использую лямбда-выражения. Код является более кратким и понятным.Конечно, у каждого свои привычки кодирования.Если вам это не нравится, не распыляйтесь.