Список общих операций более элегантен, чем для циклов

Java задняя часть

Список часто используемых лямбда-выражений — операция с одним списком

Мало знаний, большой вызов! Эта статья участвует в "Необходимые знания для программистов«Творческая деятельность

Эта статья также участвуетПроект «Звезда раскопок», чтобы выиграть творческие подарочные наборы и бросить вызов творческим поощрениям

введение

После использования 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));

Суммировать

Вышеупомянутая часть представляет собой операцию с одним списком, который обычно используется редактором в моей работе. В проекте могут быть более сложные сценарии. При необходимости вы можете использовать комбинацию нескольких методов. Я чувствую, что использую лямбда-выражения. Код является более кратким и понятным.Конечно, у каждого свои привычки кодирования.Если вам это не нравится, не распыляйтесь.