当前位置:   article > 正文

Java - Stream流式编程

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)  
  • 1
  • 2
  • 3
  • 4
  • 5

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<>());
  • 1
  • 2
  • 3
  • 4
  • 5

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());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
// map:将流中的每个元素映射为另一个元素,生成一个新的流
// 输出每个Student
List<Integer> list2 = selectList.stream().map(student -> student.getName().length()).collect(Collectors.toList());
  • 1
  • 2
  • 3
// 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());
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
// distinct:去重
List<Integer> list6 = numberList.stream().distinct().collect(Collectors.toList());
  • 1
  • 2
// limit:截取前几个元素
List<Integer> list7 = numberList.stream().limit(3).collect(Collectors.toList());
  • 1
  • 2
// skip:越过前几个元素
List<Integer> list8 = numberList.stream().skip(3).collect(Collectors.toList());
  • 1
  • 2

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()));
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
// collect:将流中的元素收集到一个集合中。可以通过Collectors工具类提供的方法来实现不同类型的收集操作。
// 例如:从查询到的所有学生中,过滤id>10的,然后将过滤出来的所有学生放进一个新的集合中
List<Student> studentList = selectList.stream().filter(student -> student.getId() > 10).collect(Collectors.toList());
  • 1
  • 2
  • 3
// reduce:对流中的元素求和
int sum = numberList.stream().reduce(0, Integer::sum);
  • 1
  • 2
// count:统计个数
long count = numberList.stream().count();
  • 1
  • 2
// anyMatch:判断流中是否存在任意一个元素满足给定条件。
boolean anyMatch = numberList.stream().anyMatch(integer -> integer % 2 == 0);
  • 1
  • 2
// anyMatch:判断流中的所有元素是否都满足给定条件。
boolean allMatch = numberList.stream().allMatch(integer -> integer % 2 == 0);
  • 1
  • 2
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/632732
推荐阅读
相关标签
  

闽ICP备14008679号