Java - Stream流式编程

Stream流式操作

Stream流式操作,就是学习java.util.stream包下的APIStream不同于java的输入输出流,是实现对集合(Collection)的复杂操作,例如查找、替换、过滤和映射数据等,集合是一种静态的数据结构,存储在内存中,而Stream是用于计算的,通过CPU实现计算,因此可以认为Stream就是处理集合数据的各种算法流程。

Stream流式操作流程

Stream流式操作主要有 3 个步骤:

1、创建Stream对象:通过一些数据源创建流对象

2、中间操作:对数据源的数据进行处理(过滤、排序等)

3、终止操作:一旦执行终止操作, 就执行中间的链式操作,并产生结果

Stream的获取

1.针对集合:Collection中的方法
    Stream<E> stream()  
    
2.针对数组:Stream接口中的静态方法:
    static <T> Stream<T> of(T... values)  

Stream的操作

准备需要操作的集合

// 由数字组成的集合
List<Integer> numberList = Arrays.asList(3, 1, 4, 1, 5, 9, 2, 6, 5);

// Student类:自增的主键id,name由uuid生成,且首位是数字
List<Student> selectList = studentMapper.selectList(new LambdaQueryWrapper<>());

Stream的中间操作

// filter:过滤
// 截取首位数字,输出取余为0的对象
List<Student> list1 = selectList.stream().filter(student -> {
    int i = Integer.parseInt(student.getName().substring(0, 1));
    return 0 == (i % 2);
}).collect(Collectors.toList());
// map:将流中的每个元素映射为另一个元素,生成一个新的流
// 输出每个Student
List<Integer> list2 = selectList.stream().map(student -> student.getName().length()).collect(Collectors.toList());
// sorted:对流中的元素进行排序,默认是自然顺序排序,也可以传入Comparator进行自定义排序
// 集合中是一个对象
// 根据id正序
List<Student> list3 = selectList.stream().sorted(Comparator.comparing(Student::getId)).collect(Collectors.toList());
// 根据id倒叙
List<Student> list4 = selectList.stream().sorted(Comparator.comparing(Student::getId).reversed()).collect(Collectors.toList());
// 集合中是数字
List<Integer> list5 = numberList.stream().sorted((o1, o2) -> {
    if (o1.compareTo(o2) > 0) {
        return -1;
    } else {
        return 1;
    }
}).collect(Collectors.toList());
// distinct:去重
List<Integer> list6 = numberList.stream().distinct().collect(Collectors.toList());
// limit:截取前几个元素
List<Integer> list7 = numberList.stream().limit(3).collect(Collectors.toList());
// skip:越过前几个元素
List<Integer> list8 = numberList.stream().skip(3).collect(Collectors.toList());

Stream的终止操作

// forEach:遍历操作,没有返回值,在accept方法中编写集合处理逻辑即可
selectList.forEach(new Consumer<Student>() {
    @Override
    public void accept(Student student) {
        System.err.println(student.getId()+" -- "+student.getName())
    }
});
// 可简化为
selectList.forEach(student -> System.err.println(student.getId()+" -- "+student.getName()));
// collect:将流中的元素收集到一个集合中。可以通过Collectors工具类提供的方法来实现不同类型的收集操作。
// 例如:从查询到的所有学生中,过滤id>10的,然后将过滤出来的所有学生放进一个新的集合中
List<Student> studentList = selectList.stream().filter(student -> student.getId() > 10).collect(Collectors.toList());
// reduce:对流中的元素求和
int sum = numberList.stream().reduce(0, Integer::sum);
// count:统计个数
long count = numberList.stream().count();
// anyMatch:判断流中是否存在任意一个元素满足给定条件。
boolean anyMatch = numberList.stream().anyMatch(integer -> integer % 2 == 0);
// anyMatch:判断流中的所有元素是否都满足给定条件。
boolean allMatch = numberList.stream().allMatch(integer -> integer % 2 == 0);
  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值