Java 8引入了Stream API,标志着集合处理进入了一个全新的时代。Stream API以函数式编程风格,提供了高效、简洁的方式来处理集合数据。通过一系列流操作,如过滤、映射、排序等,你可以轻松完成复杂的集合处理任务,而无需编写冗长的迭代代码。本文将带你快速了解Stream API的核心概念和用法,让你领略到它带来的编程之美。无论是初学者还是资深开发者,都能从中受益,提升Java编程的效率和乐趣。
定义基础数据
@Data
public class User implements Serializable {
public static final List<User> list = new ArrayList<>();
private static final long serialVersionUID = -3313090483884742935L;
static {
list.add(User.create("张三", 18, 1, LocalDate.of(1990, 1, 1)));
list.add(User.create("李四", 19, 2, LocalDate.of(1991, 2, 2)));
list.add(User.create("王五", 28, 2, LocalDate.of(2000, 3, 3)));
}
private String name;
private Integer age;
private Integer sex;
private LocalDate birthday;
public static User create(String name, int age, int sex, LocalDate birthday) {
User user2 = new User();
user2.setName(name);
user2.setAge(age);
user2.setSex(sex);
user2.setBirthday(birthday);
return user2;
}
}
示例:
// 筛选出年龄大于18的用户
List<User> collect = list.stream().filter(user -> user.getAge() > 18).collect(Collectors.toList());
// 筛选出性别为2的用户
List<User> collect1 = list.stream().filter(user -> user.getSex() == 2).collect(Collectors.toList());
// 将用户列表映射为年龄列表
// 等同于list.stream().map(user -> user.getAge()).collect(Collectors.toList()); 不过使用的是Java8的方法引用
List<Integer> collect2 = list.stream().map(User::getAge).collect(Collectors.toList());
// 映射用户名的长度列表
List<Integer> collect3 = list.stream().map(user -> user.getName().length()).collect(Collectors.toList());
// 筛选出年龄大于18的用户,并获取其名字列表
List<String> collect4 = list.stream().filter(user -> user.getAge() > 18).map(User::getName).collect(Collectors.toList());
// 筛选出年龄大于18的用户,并获取其名字集合,确保唯一性
Set<String> collect5 = list.stream().filter(user -> user.getAge() > 18).map(User::getName).collect(Collectors.toSet());
// 查找年龄最大的用户
Optional<User> optional = list.stream().max(Comparator.comparingInt(User::getAge));
// 查找年龄最小的用户
Optional<User> optional1 = list.stream().min(Comparator.comparingInt(User::getAge));
// 统计年龄大于18的用户数量
long count = list.stream().filter(user -> user.getAge() > 18).count();
// 获取不同的性别列表
List<Integer> collect6 = list.stream().map(User::getSex).distinct().collect(Collectors.toList());
// 查找第一个性别为2的用户
Optional<User> optional2 = list.stream().filter(user -> user.getSex() == 2).findFirst();
// 查找任意一个性别为2的用户
Optional<User> optional3 = list.stream().filter(user -> user.getSex() == 2).findAny();
// 获取前两个用户
List<User> collect7 = list.stream().limit(2).collect(Collectors.toList());
// 跳过前两个用户
List<User> collect8 = list.stream().skip(2).collect(Collectors.toList());
// 跳过第一个用户,获取接下来的两个用户
List<User> collect9 = list.stream().skip(1).limit(2).collect(Collectors.toList());
// 按生日升序排序用户
List<User> collect10 = list.stream().sorted(Comparator.comparing(User::getBirthday)).collect(Collectors.toList());
// 按生日降序排序用户
List<User> collect11 = list.stream().sorted(Comparator.comparing(User::getBirthday).reversed()).collect(Collectors.toList());
// 计算所有用户年龄的总和
int sum = list.stream().mapToInt(User::getAge).sum();
// 获取所有用户中最大的年龄
int max = list.stream().mapToInt(User::getAge).max().getAsInt();
// 获取所有用户中最大的年龄,如果没有则默认为0
int max1 = list.stream().mapToInt(User::getAge).max().orElse(0);
// 获取所有用户中最小的年龄
int min = list.stream().mapToInt(User::getAge).min().getAsInt();
// 获取所有用户中最小的年龄,如果没有则默认为0
int min1 = list.stream().mapToInt(User::getAge).min().orElse(0);
// 计算所有用户年龄的平均值
double avg = list.stream().mapToInt(User::getAge).average().getAsDouble();
// 计算所有用户年龄的平均值,如果没有则默认为0
double avg1 = list.stream().mapToInt(User::getAge).average().orElse(0);
// 找出年龄最大的用户
User reduce = list.stream().reduce((a, b) -> a.getAge() > b.getAge() ? a : b).orElse(null);
// 将所有用户的金额相加
BigDecimal decimal = list.stream().map(User::getMoney).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);
// 将用户名转换为字符流
Stream<Character> collect12 = list.stream().flatMap(user -> user.getName().chars().mapToObj(c -> (char) c));
// 将用户名转换为整数流
IntStream intStream = list.stream().flatMapToInt(user -> user.getName().chars());
// 将用户名转换为长整数流
LongStream longStream = list.stream().flatMapToLong(user -> user.getName().chars().mapToLong(c -> c));
// 将用户名转换为双精度浮点数流
DoubleStream doubleStream = list.stream().flatMapToDouble(user -> user.getName().chars().mapToDouble(c -> c));
// 按性别分组用户
Map<Integer, List<User>> collect14 = list.stream().collect(Collectors.groupingBy(User::getSex));
// 检查所有用户是否都大于18岁
boolean allMatch = list.stream().allMatch(user -> user.getAge() > 18);
// 检查是否有用户大于18岁
boolean anyMatch = list.stream().anyMatch(user -> user.getAge() > 18);
// 检查是否所有用户都小于等于18岁
boolean noneMatch = list.stream().noneMatch(user -> user.getAge() > 18);
// 创建一个名字到用户映射的字典
Map<String, User> collect15 = list.stream().collect(Collectors.toMap(User::getName, user -> user));
// 创建一个名字到生日的映射的字典
Map<String, LocalDate> collect16 = list.stream().collect(Collectors.toMap(User::getName, User::getBirthday));
// 将所有用户名连接成一个字符串
String collect17 = list.stream().map(User::getName).collect(Collectors.joining());
// 将所有用户名以逗号分隔连接成一个字符串
String collect18 = list.stream().map(User::getName).collect(Collectors.joining(","));