什么是Stream流式计算
其实就是把存储的数据,进行数据筛选的操作 它是JDK1.8的新特性(Stream流式计算 关于时间的API 函数式接口 lambda表达式)
所有的流都在java.util.stream下
常用API:
stream 把容器转换为stream对象
default Stream<E> stream() { return StreamSupport.stream(spliterator(), false); }
- filter 进行数据过滤
Stream<T> filter(Predicate<? super T> predicate);
- map 进行数据转换 大小写 替换
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
- sorted 排序 默认正序 可以通过换比较位调整为倒叙
Stream<T> sorted(Comparator<? super T> comparator);
- limit 分页 参数是几就取几条数据
Stream<T> limit(long maxSize);
- count 返回流的数据总和
long count();
代码进行数据筛选
package com.wyh.stream; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @program: JUC * @description: 用户信息 * @author: 魏一鹤 * @createDate: 2022-03-06 16:12 **/ @Data @AllArgsConstructor @NoArgsConstructor //有参构造 无参构造 get set toString方法 public class User { private int id; private String name; private int age; }
package com.wyh.stream; /** * @program: JUC * @description: Stream流式计算 * @author: 魏一鹤 * @createDate: 2022-03-06 16:13 **/ import java.util.Arrays; import java.util.List; /** * 题目要求 只能用一行代码实现 * 现在有五个用户 请按照以下要求进行筛选 * 1 ID必须是偶数 * 2 年龄必须大于23岁 * 3 用户名字母转为大写 * 4 用户名字母正序/倒序排序 * 5 只输出一个用户 **/ public class StreamTest { public static void main(String[] args){ //用户信息 User u1=new User(1,"a",21); User u2=new User(2,"b",22); User u3=new User(3,"c",23); User u4=new User(4,"d",24); User u5=new User(5,"e",25); //把用户信息全部存放在一个容器中 //集合就是存储 List<User> users= Arrays.asList(u1,u2,u3,u4,u5); //计算交给Stream流 //把list转换为流 .stream()会把容器转换为stream对象 使用filter方法进行条件过滤 // 1 ID必须是偶数 //User(id=2, name=b, age=22) //User(id=4, name=d, age=24) System.out.println("ID必须是偶数"); users.stream() .filter((user)->{return user.getId()%2==0;}) .forEach(System.out::println); //2 年龄必须大于23岁 System.out.println("年龄必须大于23岁"); users.stream() //filer进行条件过滤 .filter((user)->{return user.getAge()>23;}) .forEach(System.out::println); //3用户名字母转为大写 System.out.println("用户名字母转为大写"); //map进行数据转换 users.stream() .map((user)->{return user.getName().toUpperCase();}) .forEach(System.out ::println); //4 用户名字母正序排序 System.out.println("用户名字母正序排序"); //sorted默认正序排序 users.stream() .map((user)->{return user.getName().toUpperCase();}) .sorted((uu1,uu2)->{return uu1.compareTo(uu2);}) .forEach(System.out ::println); //4 用户名字母倒叙排序 System.out.println("用户名字母倒叙排序"); users.stream() .map((user)->{return user.getName().toUpperCase();}) .sorted((uu1,uu2)->{return uu2.compareTo(uu1);}) .forEach(System.out ::println); //5 只输出一个用户 System.out.println("只输出一个用户"); //limit分页 参数为输出几个 limit(long maxSize); users.stream().limit(1).forEach(System.out ::println); //最终各种条件合并成一行代码 //lambda表达式 函数式接口 链式编程 Stream流式计算 System.out.println("-------------------end---------------------"); users.stream() .filter((user)->{return user.getId()%2==0;}) //筛选 id为偶数 .filter((user)->{return user.getAge()>23;}) //筛选 年龄大于23 .map((user)->{return user.getName().toUpperCase();})//数据转化 字母大写 .sorted((uu1,uu2)->{return uu1.compareTo(uu2);})//排序 正序 .limit(1) //分页 1条数据 .forEach(System.out ::println); //流的数据总数 long count = users.stream() .count(); System.out.println(count); //5 } }
ID必须是偶数
User(id=2, name=b, age=22)
User(id=4, name=d, age=24)
年龄必须大于23岁
User(id=4, name=d, age=24)
User(id=5, name=e, age=25)
用户名字母转为大写
A
B
C
D
E
用户名字母正序排序
A
B
C
D
E
用户名字母倒叙排序
E
D
C
B
A
只输出一个用户
User(id=1, name=a, age=21)
-------------------end---------------------
D
流的数据总数:5