假设我有一个User类
// 示例数据
List<User> users = Arrays.asList(
new User("Alice", 25, "Female"),
new User("Bob", 30, "Male"),
new User("Charlie", 35, "Male"),
new User("Dave", 40, "Male"),
new User("Eve", 22, "Female")
);
stream流19种常用方法
filter
通过给定的条件(谓词)筛选流中的元素。
filter(Predicate<? super T> predicate):
// 1. filter(Predicate<? super T> predicate):筛选年龄大于30的用户
List<User> filteredUsers = users.stream()
.filter(user -> user.getAge() > 30)
.collect(Collectors.toList());
System.out.println("年龄大于30的用户:" + filteredUsers);
map
将流中的每个元素映射为另一个值。
map(Function<? super T, ? extends R> mapper):
// 2. map(Function<? super T, ? extends R> mapper):转换为名称列表
List<String> names = users.stream()
.map(User::getName)
.collect(Collectors.toList());
System.out.println("名称列表:" + names);
flatMap
将流中的每个元素映射为一个流,然后将这些流连接成一个流。
flatMap(Function<? super T, ? extends Stream<? extends R>> mapper):
// 3. flatMap(Function<? super T, ? extends Stream<? extends R>> mapper):拆分名称为字符列表
List<String> letters = users.stream()
.flatMap(user -> Arrays.stream(user.getName().split("")))
.collect(Collectors.toList());
System.out.println("拆分后的字母:" + letters);
distinct
去除流中的重复元素。
distinct():
// 4. distinct():去重性别
List<String> uniqueGenders = users.stream()
.map(User::getSex)
.distinct()
.collect(Collectors.toList());
System.out.println("去重后的性别:" + uniqueGenders);
sorted
对流中的元素进行自然排序。
sorted():
// 5. sorted():按年龄自然排序
List<User> sortedUsersByAge = users.stream()
.sorted((user1, user2) -> Integer.compare(user1.getAge(), user2.getAge()))
.collect(Collectors.toList());
System.out.println("按年龄排序:" + sortedUsersByAge);
sorted
使用自定义比较器对流中的元素进行排序。
sorted(Comparator<? super T> comparator):
// 6. sorted(Comparator<? super T> comparator):按名称长度排序
List<User> sortedUsersByNameLength = users.stream()
.sorted((user1, user2) -> Integer.compare(user1.getName().length(), user2.getName().length()))
.collect(Collectors.toList());
System.out.println("按名称长度排序:" + sortedUsersByNameLength);
peek
对流中的每个元素执行操作,但不改变流中的元素。
peek(Consumer<? super T> action):
// 7. peek(Consumer<? super T> action):打印每个用户
users.stream()
.peek(System.out::println)
.collect(Collectors.toList());
limit
截断流,使其最多只包含指定数量的元素。
limit(long maxSize):
// 8. limit(long maxSize):限制数量
List<User> limitedUsers = users.stream()
.limit(2)
.collect(Collectors.toList());
System.out.println("前两个用户:" + limitedUsers);
skip
跳过指定数量的元素,返回剩余的元素组成的流。
skip(long n):
// 9. skip(long n):跳过前两个用户
List<User> skippedUsers = users.stream()
.skip(2)
.collect(Collectors.toList());
System.out.println("跳过前两个用户:" + skippedUsers);
forEach
对流中的每个元素执行操作。
forEach(Consumer<? super T> action):
// 10. forEach(Consumer<? super T> action):遍历打印
System.out.println("打印每个用户:");
users.stream()
.forEach(System.out::println);
toArray
将流中的元素收集到一个数组中。
toArray():
// 11. toArray():转换为数组
User[] usersArray = users.stream()
.toArray(User[]::new);
System.out.println("用户数组:" + Arrays.toString(usersArray));
reduce
使用给定的初始值和二元运算符将流中的元素合并为单个值。
reduce(T identity, BinaryOperator<T> accumulator):
// 12. reduce(BinaryOperator<T> accumulator):累加所有年龄
int totalAge = users.stream()
.map(User::getAge)
.reduce(0, Integer::sum);
System.out.println("所有用户年龄总和:" + totalAge);
collect
将流中的元素收集到一个结果容器中,如列表、集合、映射等。
collect(Collector<? super T, A, R> collector):
// 13. collect(Collector<? super T, A, R> collector):按性别收集为Map
Map<String, List<User>> genderGroup = users.stream()
.collect(Collectors.groupingBy(User::getSex));
System.out.println("按性别分组:" + genderGroup);
count
计算流中的元素个数。
count():
// 14. count():计数
long userCount = users.stream()
.count();
System.out.println("用户数量:" + userCount);
anyMatch
检查流中是否至少有一个元素满足给定条件。
anyMatch(Predicate<? super T> predicate):
// 15. anyMatch(Predicate<? super T> predicate):是否存在年龄大于30的用户
boolean anyOlderThan30 = users.stream()
.anyMatch(user -> user.getAge() > 30);
System.out.println("是否存在年龄大于30的用户:" + anyOlderThan30);
allMatch
检查流中的所有元素是否都满足给定条件。
allMatch(Predicate<? super T> predicate):
// 16. allMatch(Predicate<? super T> predicate):是否全部是女性
boolean allFemale = users.stream()
.allMatch(user -> "Female".equals(user.getSex()));
System.out.println("是否全部是女性:" + allFemale);
noneMatch
检查流中是否没有任何元素满足给定条件。
noneMatch(Predicate<? super T> predicate):
// 17. noneMatch(Predicate<? super T> predicate):是否没有未成年用户
boolean noneUnder18 = users.stream()
.noneMatch(user -> user.getAge() < 18);
System.out.println("是否没有未成年用户:" + noneUnder18);
findFirst
返回流中的第一个元素(如果存在)。
findFirst():
// 18. findFirst():获取第一个用户
Optional<User> firstUser = users.stream()
.findFirst();
System.out.println("第一个用户:" + firstUser.orElse(new User("", 0, "")));
findAny
返回流中的任意一个元素(如果存在)。
findAny():
// 19. findAny():获取任意一个用户
Optional<User> anyUser = users.stream()
.findAny();
System.out.println("任意一个用户:" + anyUser.orElse(new User("", 0, "")));
使用skip和limit进行列表的分页操作
int size = 2; // 每页显示的数量
int current = 1; // 页码,从1开始
List<User> usersPerPage = users.stream()
.skip((current- 1) * size) // 跳过之前的页数
.limit(size) // 限制每页的数量
.collect(Collectors.toList());
System.out.println("第" + pageNumber + "页的用户:" + usersPerPage);
完整代码示例
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
// 示例数据
List<User> users = Arrays.asList(
new User("Alice", 25, "Female"),
new User("Bob", 30, "Male"),
new User("Charlie", 35, "Male"),
new User("Dave", 40, "Male"),
new User("Eve", 22, "Female")
);
// 1. filter(Predicate<? super T> predicate):筛选年龄大于30的用户
List<User> filteredUsers = users.stream()
.filter(user -> user.getAge() > 30)
.collect(Collectors.toList());
System.out.println("年龄大于30的用户:" + filteredUsers);
// 2. map(Function<? super T, ? extends R> mapper):转换为名称列表
List<String> names = users.stream()
.map(User::getName)
.collect(Collectors.toList());
System.out.println("名称列表:" + names);
// 3. flatMap(Function<? super T, ? extends Stream<? extends R>> mapper):拆分名称为字符列表
List<String> letters = users.stream()
.flatMap(user -> Arrays.stream(user.getName().split("")))
.collect(Collectors.toList());
System.out.println("拆分后的字母:" + letters);
// 4. distinct():去重性别
List<String> uniqueGenders = users.stream()
.map(User::getSex)
.distinct()
.collect(Collectors.toList());
System.out.println("去重后的性别:" + uniqueGenders);
// 5. sorted():按年龄自然排序
List<User> sortedUsersByAge = users.stream()
.sorted((user1, user2) -> Integer.compare(user1.getAge(), user2.getAge()))
.collect(Collectors.toList());
System.out.println("按年龄排序:" + sortedUsersByAge);
// 6. sorted(Comparator<? super T> comparator):按名称长度排序
List<User> sortedUsersByNameLength = users.stream()
.sorted((user1, user2) -> Integer.compare(user1.getName().length(), user2.getName().length()))
.collect(Collectors.toList());
System.out.println("按名称长度排序:" + sortedUsersByNameLength);
// 7. peek(Consumer<? super T> action):打印每个用户
users.stream()
.peek(System.out::println)
.collect(Collectors.toList());
// 8. limit(long maxSize):限制数量
List<User> limitedUsers = users.stream()
.limit(2)
.collect(Collectors.toList());
System.out.println("前两个用户:" + limitedUsers);
// 9. skip(long n):跳过前两个用户
List<User> skippedUsers = users.stream()
.skip(2)
.collect(Collectors.toList());
System.out.println("跳过前两个用户:" + skippedUsers);
// 10. forEach(Consumer<? super T> action):遍历打印
System.out.println("打印每个用户:");
users.stream()
.forEach(System.out::println);
// 11. toArray():转换为数组
User[] usersArray = users.stream()
.toArray(User[]::new);
System.out.println("用户数组:" + Arrays.toString(usersArray));
// 12. reduce(BinaryOperator<T> accumulator):累加所有年龄
int totalAge = users.stream()
.map(User::getAge)
.reduce(0, Integer::sum);
System.out.println("所有用户年龄总和:" + totalAge);
// 13. collect(Collector<? super T, A, R> collector):按性别收集为Map
Map<String, List<User>> genderGroup = users.stream()
.collect(Collectors.groupingBy(User::getSex));
System.out.println("按性别分组:" + genderGroup);
// 14. count():计数
long userCount = users.stream()
.count();
System.out.println("用户数量:" + userCount);
// 15. anyMatch(Predicate<? super T> predicate):是否存在年龄大于30的用户
boolean anyOlderThan30 = users.stream()
.anyMatch(user -> user.getAge() > 30);
System.out.println("是否存在年龄大于30的用户:" + anyOlderThan30);
// 16. allMatch(Predicate<? super T> predicate):是否全部是女性
boolean allFemale = users.stream()
.allMatch(user -> "Female".equals(user.getSex()));
System.out.println("是否全部是女性:" + allFemale);
// 17. noneMatch(Predicate<? super T> predicate):是否没有未成年用户
boolean noneUnder18 = users.stream()
.noneMatch(user -> user.getAge() < 18);
System.out.println("是否没有未成年用户:" + noneUnder18);
// 18. findFirst():获取第一个用户
Optional<User> firstUser = users.stream()
.findFirst();
System.out.println("第一个用户:" + firstUser.orElse(new User("", 0, "")));
// 19. findAny():获取任意一个用户
Optional<User> anyUser = users.stream()
.findAny();
System.out.println("任意一个用户:" + anyUser.orElse(new User("", 0, "")));
}
}
class User {
private String name;
private int age;
private String sex;
public User(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getSex() {
return sex;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
'}';
}
}