JAVASEday18 Stream流

JAVASEday18 Stream流Java8 中的 StreamAPI 提供了一种高效处理集合数据的方式 通过创建流 中间操作和终止操作来实现复杂的数据处理

大家好,欢迎来到IT知识分享网。

Stream流

Stream操作的三个步骤
创建流的几种方式:
//1.创建流 //方式1 集合中有一个方法 stream() List<Integer> list = Arrays.asList(10, 20, 30); Stream<Integer> stream = list.stream(); //方式2 Arrays 中的静态方法,可以获取一个流 Stream<Integer> stream1 = Arrays.stream(new Integer[]{ 
   100, 200, 300}); //方式3 Stream中的静态方法 of() Stream<Integer> integerStream = Stream.of(30, 60, 90, 30); //方式4 创建一个无限流 Stream<Integer> iterate = Stream.iterate(1, new UnaryOperator<Integer>() { 
    @Override public Integer apply(Integer integer) { 
    return integer + 1; } }); //中间操作完了后,会返回一个持有结果的新流 Stream<Integer> iterate2 = iterate.limit(9); //没有进行终止操作,中间环节,不执行,体现的是一种延迟加载的思想 iterate2.forEach(System.out::println); //方式5:创建一个无限流 Stream.generate(() -> Math.random()).limit(5).forEach(System.out::println); 

注意:如果没有进行中断操作,中间环节不执行,它体现了一种延迟加载思想。

Stream的中间操作
//终止操作 // employeeStream.forEach(System.out::println); //获取姓赵的员工 Stream<Employee> stream1 = stream.distinct().filter((e) -> e.getName().startsWith("赵")); stream1.forEach(System.out::println); List<Integer> numbers = Arrays.asList(10, 20, 30,60); //Stream<? extends Number> stream2 = numbers.stream().limit(2);//从头开始截断几个元素 Stream<? extends Number> stream2 = numbers.stream().skip(3);//跳过前几个元素 stream2.forEach(System.out::println); 

映射:

//2. 映射 //map(Function f) 接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。 //flatMap(Function f) 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流. // List<Employee> emps = Arrays.asList( new Employee(102, "李四", 59, 6666.66), new Employee(101, "张三", 18, 9999.99), new Employee(103, "王五", 28, 3333.33), new Employee(104, "赵六", 8, 7777.77), new Employee(104, "赵六", 8, 7777.77), new Employee(104, "赵六", 8, 7777.77), new Employee(105, "田七", 38, 5555.55) ); //获取流 Stream<Employee> stream = emps.stream(); //获取员工的名字 Stream<String> stringStream = stream.map(employee -> employee.getName()); stringStream.forEach(System.out::println); System.out.println("---------------------------------"); List<String> strings = Arrays.asList("aaa", "bbb", "ccc"); Stream<String> stream1 = strings.stream(); //把集合中元素变大写 stream1.map(new Function<String, String>() { 
    @Override public String apply(String s) { 
    String s1 = s.toUpperCase(); return s1; } }).forEach(System.out::println); 

排序:

 List<Integer> integers = Arrays.asList(10, 20, 30, 40,1,2); Stream<Integer> stream = integers.stream(); //stream.sorted().forEach(System.out::println); //从大到小排序 stream.sorted((x,y)->Integer.compare(y,x)).forEach(System.out::println); 
Stream的终止操作

1.查找与匹配
allMatch(Predicate p) 检查是否匹配所有元素 比如判断 所有员工的年龄都是17岁 如果有一个不是,就返回false
anyMatch(Predicate p) 检查是否至少匹配一个元素 比如判断是否有姓王的员工,如果至少有一个就返回true
noneMatch(Predicate p) 检查是否没有匹配所有元素 比如判断所有员工的工资都是否都是高于3000 如果有一个人低于3000 就返回false
findFirst() 返回第一个元素 比如获取工资最高的人 或者 获取工资最高的值是
findAny() 返回当前流中的任意元素 比如随便获取一个姓王的员工
count() 返回流中元素总数
max(Comparator c) 返回流中最大值 比如:获取最大年龄值
min(Comparator c) 返回流中最小值 比如:获取最小年龄的值
forEach(Consumer c) 内部迭代(使用 Collection 接口需要用户去做迭代,称为外部迭代。相反,Stream API 使用内部迭代——它帮你把迭代做了)
2.归约
reduce(T iden, BinaryOperator b) 参1 是起始值, 参2 二元运算 可以将流中元素反复结合起来,得到一个值。返回 T 比如: 求集合中元素的累加总和
reduce(BinaryOperator b) 这个方法没有起始值 可以将流中元素反复结合起来,得到一个值。返回 Optional , 比如你可以算所有员工工资的总和
备注:map 和 reduce 的连接通常称为 map-reduce 模式,因 Google 用它来进行网络搜索而出名。
3.收集
collect(Collector c) 将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法
Collector 接口中方法的实现决定了如何对流执行收集操作(如收集到 List、Set、Map)。
但是 Collectors 实用类提供了很多静态方法,可以方便地创建常见收集器实例,具体方法与实例如下
4.Collectors 中的方法
List toList() 把流中元素收集到List 比如把所有员工的名字通过map()方法提取出来之后,在放到List集合中去
例子:List emps= list.stream().map(提取名字).collect(Collectors.toList());
Set toSet() 把流中元素收集到Set 比如把所有员工的名字通过map()方法提取出来之后,在放到Set集合中去
例子:Set emps= list.stream().collect(Collectors.toSet());
Collection toCollection() 把流中元素收集到创建的集合 比如把所有员工的名字通过map()方法提取出来之后,在放到自己指定的集合中去
例子:Collectionemps=list.stream().map(提取名字).collect(Collectors.toCollection(ArrayList::new));
Long counting() 计算流中元素的个数
例子:long count = list.stream().collect(Collectors.counting());
Integer summingInt() 对流中元素的整数属性求和
例子:inttotal=list.stream().collect(Collectors.summingInt(Employee::getSalary));
Double averagingInt() 计算流中元素Integer属性的平均值
例子:doubleavg= list.stream().collect(Collectors.averagingInt(Employee::getSalary));
IntSummaryStatistics summarizingInt() 收集流中Integer属性的统计值。
例子:DoubleSummaryStatistics dss= list.stream().collect(Collectors.summarizingDouble(Employee::getSalary));
从DoubleSummaryStatistics 中可以获取最大值,平均值等
double average = dss.getAverage();
long count = dss.getCount();
double max = dss.getMax();
String joining() 连接流中每个字符串 比如把所有人的名字提取出来,在通过”-“横杠拼接起来
例子:String str= list.stream().map(Employee::getName).collect(Collectors.joining(”-“));
Optional maxBy() 根据比较器选择最大值 比如求最大工资
例子:Optionalmax= list.stream().collect(Collectors.maxBy(comparingInt(Employee::getSalary)));
Optional minBy() 根据比较器选择最小值 比如求最小工资
例子:Optional min = list.stream().collect(Collectors.minBy(comparingInt(Employee::getSalary)));
归约产生的类型 reducing() 从一个作为累加器的初始值开始,利用BinaryOperator与流中元素逐个结合,从而归约成单个值
例子:inttotal=list.stream().collect(Collectors.reducing(0, Employee::getSalar, Integer::sum));
转换函数返回的类型 collectingAndThen() 包裹另一个收集器,对其结果转换函数
例子:inthow= list.stream().collect(Collectors.collectingAndThen(Collectors.toList(), List::size));
Map<K, List> groupingBy() 根据某属性值对流分组,属性为K,结果为V 比如按照 状态分组
例子:Map<Emp.Status, List> map= list.stream().collect(Collectors.groupingBy(Employee::getStatus));
Map<Boolean, List> partitioningBy() 根据true或false进行分区 比如 工资大于等于6000的一个区,小于6000的一个区
例子:Map<Boolean,List>vd= list.stream().collect(Collectors.partitioningBy(Employee::getSalary));

















































免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/120344.html

(0)
上一篇 2025-10-30 13:15
下一篇 2025-10-30 13:26

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信