В последнее время я обнаружил, что этот поток используется очень часто, и я освоил базовую грамматику, однако при столкновении с реальными сценариями их запись занимает много времени, поэтому мы суммируем методы написания распространенных сценариев, чтобы облегчить быстрое применение в реальных сценариях.
Кроме того, для получения базовой грамматики и обнаруженных ошибок вы можете обратиться к другим моим статьям.
- Базовый справочник по синтаксису
- Возникшие проблемы и решения
这个文章访问量是真多,应该这个错比较常见,大家通过搜索引擎搜到了它
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, лямбда-выражение и поток.