Stream 中⽂称为 “流”,通过将集合转换为这么⼀种叫做 “流”的元素队列,通过声明性⽅式,能够对集合中的每个元素进⾏⼀系列并⾏或串⾏的流⽔线操作
元素是特定类型的对象,所以元素集合看作⼀种流, 流在管道中传输, 且可以在管道的节点上进⾏处理, ⽐如 排序,聚合,过滤等操作
操作详情
-
数据元素便是原始集合,如list,set,map
-
生成流,可以使串行流stream或者并行流parallelStream
-
中间操作,可以使排序,聚合,过滤,转换等
-
终端操作,很多流操作本身就会返回一个流,所以多个操作可以直接连接起来,最后统一进行收集
开发前数据准备
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserDTO {
private Long id;
private String name;
private Integer age;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class VideoOrder {
private String tradeNo;
private String title;
private int money;
}
Map操作
在日常开发中,对象转换是必不可少的,比如:mapper层实体类获取,到业务层转换为DTO,业务层到控制器AO等。
public static void testMap(){
List<User> list = Arrays.asList(
new User(1L, "张三", 18),
new User(2L, "李四", 20),
new User(3L, "王五", 33),
new User(4L, "赵六", 44));
List<UserDTO> userDTOList = list.stream().map(obj -> {
UserDTO userDTO = new UserDTO(obj.getId(), obj.getName(), obj.getAge());
return userDTO;
}).collect(Collectors.toList());
userDTOList.forEach(System.out::println);
}
filter条件过滤
有时候我们获取数据库的列表,有些数据不是我们想要的,这时候我们可以过滤掉不需要的数据。如下面示例过滤掉字符串长度大于7的字符串。
public static void testFilter(){
List<String> list = Arrays.asList(
"SpringBoot",
"SpringCloud",
"Spring",
"SpringMVC",
"mybatis",
"html",
"git"
);
List<String> stringList = list.stream().filter(obj -> obj.length() > 7).collect(Collectors.toList());
System.out.println(stringList);
}
sorted排序
sorted对流进行自然排序,其中的元素需要实现comparable接口 sorted(Comparatorcomparator)用于自定义升降序
public static void testSorted(){
List<String> list = Arrays.asList(
"SpringBoot",
"SpringCloud",
"Spring",
"SpringMVC",
"mybatis",
&