Stream流

strean只能被消费一次

三种创建方法

  1. 针对集合Collection, stream(), 接口当中定义的默认方法.
  2. Arrays.stream(T[] t), 把数组搞成一个Stream流
  3. Stream.of(T ... t), 将一系列的值转换为Stream对象

获取的三种方式:
返回值都是接口类型的: Stream, 那么返回的一定是: 实现了该接口的实现类的对象.
对象.方法(); // 不考虑静态的啥的.

Stream流的常用方法

image
image

点击查看代码
copy
package com.qf.deom01; import java.util.ArrayList; import java.util.List; import java.util.Optional; import java.util.stream.Stream; public class Test01 { public static void main(String[] args) { List<String> nameList =new ArrayList<>(); nameList.add("tom"); nameList.add("tomtomtomtomtomtomtomtom"); nameList.add("jack"); nameList.add("rose"); nameList.add("john"); nameList.add("old wang"); nameList.add("jerry"); nameList.add("li lei"); nameList.add("marry"); nameList.add("bird"); nameList.add("milk"); nameList.add("jerry"); nameList.add("li lei"); nameList.add("marry"); nameList.add("bird"); nameList.add("milk"); List<Integer> number =new ArrayList<>(); number.add(1); number.add(2); number.add(10); number.add(5); //找出”j的人“(filter)predicate->过滤 nameList.stream().filter(s ->s.startsWith("j")).forEach(s -> System.out.println(s)); System.out.println("---------------"); //把j的人转大写 nameList.stream().filter(s -> s.startsWith("j")).map(s->s.toUpperCase()).forEach(s -> System.out.println(s)); System.out.println("------------------------"); //跳过 ship nameList.stream().filter(s -> s.startsWith("j")).skip(2).forEach(s -> System.out.println(s)); System.out.println("------------------------"); //去重distinct,表示对当前集合进行去除操作,重写equals和HashCode nameList.stream().distinct().filter(s -> s.startsWith("j")).forEach(s -> System.out.println(s)); System.out.println("------------------------"); //peek,中间方法,可以进行遍历 nameList.stream().filter(s -> s.startsWith("j")).peek(s -> System.out.println(s)). map(s -> s.toUpperCase()).forEach(s -> System.out.println(s)); //count计算集合种元素的数量,终结方法 System.out.println(nameList.stream().count()); /*//合并流 Stream<Stream> mySteam =Stream.of(nameList.stream(),listName.stream()); System.out.println(mySteam.count());*/ System.out.println("------------------------"); //findFirst,返会第一个元素 // Optional java8新特性,get表示储存在optional对象中的值 Optional<String> nameFirst =nameList.stream().peek(s -> System.out.println(s)).findFirst(); String str = nameFirst.get(); System.out.println(nameFirst.get()); System.out.println("------------------------"); //findAny返回任意元素 Optional optional =nameList.stream().findAny(); System.out.println(optional.get()); System.out.println("------------------------"); //// 10. anyMatch, allMatch ,noneMatch //anyMatch任意元素匹配时 Boolean result=nameList.stream().anyMatch(s ->s.startsWith("t")); System.out.println(result); //allMath所有元素匹配 Boolean result2 =nameList.stream().allMatch(s -> s.length()>3); System.out.println(result2); //noneMatch所有元素都不匹配 Boolean result3 =nameList.stream().noneMatch(s -> s.equalsIgnoreCase("BBB")); System.out.println(result3); //reduce 参数传递是biFunction, R apply(T, U) Integer tem=number.stream().reduce((s1,s2)->s2+s1).get(); System.out.println(tem); //T identity//表示操作的基数 Integer tem2 =number.stream().reduce(100,(s1,s2)->s1+s2); System.out.println(tem2); // Integer sum = number.stream().reduce(100, (a, b) -> a - b, (a, b) -> a +b ); // System.out.println(sum); System.out.println("------------------------"); // limit,从数据当中读出n条数据;中间数据 number.stream().limit(3).forEach(s->System.out.println(s)); number.stream().limit(3).peek(s->System.out.println("ttt"+s)).findFirst();//未加终结操作,无法打印peek } }

总结Stream常用方法

  1. filter
  2. map
  3. limit
  4. distinct()
  5. sorted, 两个
  6. anyMatch
  7. allMaatch

收集方法

  1. Stream接口当中定义了一个方法, 这个方法就是收集方法.
  2. Stream流当中的数据—> 还原成集合等/字符串/.
    <R, A> R collect(Collector<? super T, A, R> collector)
    这个方法的参数是一个接口: Collector.
    public interface Collector<T, A, R> {}
    提供了一个工具类: Collectors. 表示对Collector的封装

/ 1. 接口当中Stream定义了一个收集的方法;
collect(传递一个接口: Collector) // Collector接口有一个工具类,专门创建对象: Collectors
// Collectors当中提供了大量的静态方法,返回值就是Collector, 所以咱们可以直接把
Collectors.toList/toSet传入到collect方法当中

点击查看代码

将流转换为想要的集合

copy
/** * */ public class Test01 { public static void main(String[] args) { List<String> nameList =new ArrayList<>(); nameList.add("tom"); nameList.add("tomtomtomtomtomtomtomtom"); nameList.add("jack"); nameList.add("rose"); nameList.add("john"); nameList.add("old wang"); nameList.add("jerry"); nameList.add("li lei"); nameList.add("marry"); nameList.add("bird"); nameList.add("milk"); nameList.add("jerry"); nameList.add("li lei"); nameList.add("marry"); nameList.add("bird"); nameList.add("milk"); List<String> list=nameList.stream().map(s -> s.toUpperCase()).collect(Collectors.toList()); //collect可以将流转换为集合,参数为collector,这是一个接口, //这个接口提供了一个工具类:Collectors这个工具类当中的静态方法返回的就是: 实现了 //Collector接口的实现类的对象.所以可以直接传入到Collect方法当中.\ list.forEach(s -> System.out.println(s)); System.out.println(list); System.out.println("------------"); Set<String> set=nameList.stream().filter(s -> s.contains("l")).distinct().collect(Collectors.toSet()); System.out.println(set); System.out.println("------------"); Object [] tl=nameList.stream().toArray(); System.out.println(Arrays.toString(tl)); System.out.println("------------------------------"); //Collections接口只有List/Set?????Collect //toCollection当中传入的是一个Supplier接口. ArrayList<String> arrayList=nameList.stream().collect(Collectors.toCollection(()->new ArrayList<>())); HashSet<String>hashSet=nameList.stream().collect(Collectors.toCollection(()->new HashSet<>()));

将流转换为字符串

点击查看代码
copy
/*Collectors.joining() // 默认没有分隔符 Collectors.joining("分隔符") // 默认没有分隔符 Collectors.joining("分隔符", "前缀", "后缀") // 默认没有分隔符*/ //将流转换为字符串 System.out.println("------------------------------"); String str = nameList.stream().filter(s -> s.length()>8).collect(Collectors.joining()); System.out.println(str); System.out.println(nameList.stream().filter(s -> s.length()>4).collect(Collectors.joining(" "))); System.out.println(nameList.stream().filter(s -> s.length()>4). collect(Collectors.joining(" ","[","}")));

分组

简单分组partitioningBy(Boolean)

点击查看代码
copy
package com.qf.deom03; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class Test01 { public static void main(String[] args) { List<User> nameList = new ArrayList<>(); nameList.add(new User("卡卡罗特",118)); nameList.add(new User("贝吉塔",181)); nameList.add(new User("特兰克斯",8)); nameList.add(new User("悟饭",8)); nameList.add(new User("悟天",4)); nameList.add(new User("沙鲁",18)); nameList.add(new User("布罗利",38)); //partitioningBy(Boolean) Map<Boolean,List<User>> mapUser=nameList.stream().collect(Collectors.partitioningBy(person->person.getName().contains("悟"))); mapUser.forEach((k,v)->{ System.out.println(k); System.out.println(v); } ); } } 结果 ![image](https://img2023.cnblogs.com/blog/2326800/202304/2326800-20230401112211435-602612631.png)

按照你自定义的要求进行分析groupingBy

点击查看代码
copy
package com.qf.deom03; import java.util.*; import java.util.stream.Collectors; public class Test02 { public static void main(String[] args) { List<User> nameList = new ArrayList<>(); nameList.add(new User("卡卡罗特",118)); nameList.add(new User("贝吉塔",181)); nameList.add(new User("特兰克斯",8)); nameList.add(new User("悟饭",8)); nameList.add(new User("悟天",4)); nameList.add(new User("沙鲁",18)); nameList.add(new User("布罗利",38)); //groupingBy(可以自定义) Map<String,List<User>> listMap = nameList.stream().collect(Collectors.groupingBy(user -> user.getName().substring(0,2))); //keyset遍历 Set<String> setUser =listMap.keySet(); for (String s : setUser) { System.out.println(s); List<User> users =listMap.get(s); users.forEach(k->System.out.println(k)); } System.out.println("-----------------------------"); //foreach遍历 listMap.forEach((k,v)->{ System.out.println(k); System.out.println(v); }); System.out.println(listMap.size()); System.out.println(nameList.size()); System.out.println("-----------------------------"); TreeMap<String, Set<User>> treeMap = nameList.stream() .collect(Collectors.groupingBy(user -> user.getName().substring(0, 2), () -> new TreeMap<>(), Collectors.toSet())); treeMap.forEach((k, v) -> { System.out.println(k); v.forEach(s -> System.out.println(s)); System.out.println("--------------------------"); }); } } 结果 ![image](https://img2023.cnblogs.com/blog/2326800/202304/2326800-20230401112552719-942751216.png)

数据统计summarizingInt

点击查看代码
copy
package com.qf.deom03; import java.util.Arrays; import java.util.DoubleSummaryStatistics; import java.util.IntSummaryStatistics; import java.util.stream.Collectors; public class Test04 { public static void main(String[] args) { Integer[] score = {20, 48, 13, 56, 89, 32, 21, 23, 1, 23, 1, 432, 4, 235, 3, 43, 23, 123}; DoubleSummaryStatistics sum = Arrays.stream(score).collect(Collectors.summarizingDouble(i->Double.parseDouble(String.valueOf(i)))); System.out.println(sum.getSum()); // 求和 System.out.println(sum.getAverage()); // 平均数 System.out.println(sum.getMax()); // 最大值 System.out.println(sum.getMin()); // 最小值 System.out.println(sum.getCount()); // 元素的个数 } }
posted @   卡卡罗特kk  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
展开