Практический сборник: запись практических советов по Java8 Stream

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

Кроме того, для получения базовой грамматики и обнаруженных ошибок вы можете обратиться к другим моим статьям.

  • Базовый справочник по синтаксису

Новые функции Java8: подробное объяснение новых функций, таких как оптимизация HashMap, лямбда-выражение и поток.

  • Возникшие проблемы и решения

这个文章访问量是真多,应该这个错比较常见,大家通过搜索引擎搜到了它 Java8-Stream: не существует экземпляра(ов) переменной(ов) типа R, так что void соответствует R

1. Обзор сценария

1.1, роль Stream

Мы используем Stream в основном для замены раздутого цикла for и выполнения различных операций sao над коллекцией.

1.2. Сценарии использования

В основном это следующие сценарии:

1. группировать по

2. порядок (сортировка) 3. где (фильтрация) 4. отдельный (удаление дубликатов) 5. применение (выполнение различных операций в соответствии с атрибутом) 6. извлечение атрибута в виде списка

2. Советы

2.1、группировать по

Сгруппировать по полу

userList.stream()
	.collect(Collectors.groupingBy(User::getSex));
复制代码

2.2, заказать по

Отсортируйте по возрасту пользователей (по возрастанию/убыванию) и возьмите топ3

userList.stream()
	.sorted(Comparator.comparing(User::getAge).reversed())
	.limit(3)
	.collect(Collectors.toList());
复制代码

2.3, где

2.3.1, самый ценный фильтр

Получить объект с максимальным/минимальным свойством

// 最小
Optional<User> min = userList.stream()
	.min(Comparator.comparing(User::getAge));
// 最大
Optional<User> max = userList.stream()
	.max(Comparator.comparing(User::getAge));

// 获得对象
User user = min.get();
复制代码

2.3.2 Условная фильтрация

Отфильтровать пользователей моложе 30 лет

userList.stream()
	.filter(e -> e.getAge() < 30)
	.collect(Collectors.toList());
复制代码

Выберите возраст пользователя> 20 и пол — мужской (пол = 1).


userList.stream()
	.filter(u -> u.getAge() > 20 && u.getSex() == 1)
	.collect(Collectors.toList());
复制代码

Запросите первого пользователя по имени «Ли Хуа».

userList.stream().
	filter(u -> u.getName().equals("小明"))
	.findFirst().orElse(ll);
复制代码

2.4, отдельный

Получить все имена пользователей и выполнить дедупликацию

userList.stream()
	.map(User::getName)
	.distinct()
	.collect(Collectors.toList());
复制代码

Дедупликация по полю

memberListAll.stream()
	.collect(Collectors.collectingAndThen(
                        Collectors.toCollection(
				() -> new TreeSet<>(Comparator.comparing(WorkWxUserInfoVO :: getUserid))), ArrayList::new)
	);
复制代码

2.5, применить

Массовое присвоение свойства

userList.forEach(e -> {
            e.setName("hello");
        });
复制代码

обрабатывать поле

userList.stream()
	.map(user -> {user.setName(user.getName().replaceAll("\u0000", "")); return user;})
	.collect(Collectors.toList());
复制代码

Получить объект на основе поля

List<User> userList = userIds.stream()
            .map(id -> {
                User user = userService.getUserById(id);
                return user;
            })
            .collect(Collectors.toList());
复制代码

2.6, извлечь атрибуты

Извлечь один атрибут: получить все имена пользователей и выполнить дедупликацию

userList.stream()
	.map(User::getName)
	.distinct()
	.collect(Collectors.toList());
复制代码

Извлечь несколько атрибутов: объединить menuId и menuName в карту (menuId уникален)

userList.stream()
	.collect(Collectors.toMap(User::getMenuId, User::getMenuName)));
复制代码

Извлечь несколько атрибутов: объединить menuId и menuName в карту (menuId не уникален)

userList
	//去重
	.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(
                                () -> new TreeSet<>(Comparator.comparing(User :: getMenuId))), ArrayList::new))
	//转map
	.stream().collect(Collectors.toMap(User::getMenuId, User::getMenuName)));
复制代码



Выше приведены только наиболее распространенные сценарии. Дополнительные сценарии см. в разделе: Новые функции Java8: подробное объяснение новых функций, таких как оптимизация HashMap, лямбда-выражение и поток.

Supongo que te gusta

Origin juejin.im/post/7088512333042958350
Recomendado
Clasificación