当前位置: 首页 > news >正文

java Stream流

Stream流

双列集合无法直接使用stream流,可以通过keyset()或enteyset转换为单列集合,再进行操作

 1.单列集合

package mystream;import java.util.ArrayList;
import java.util.Collections;public class StreamDemo1 {public static void main(String[] args) {//单列集合 default Stream<E> stream() Collection中的默认方法//1.单列集合获取stream流ArrayList<String> list=new ArrayList<>();Collections.addAll(list,"a","b","c","d","e");/*//获取到一条流水线,并把集合中的数据放到流水线上Stream<String> stream1=list.stream();stream1.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {//s依次表示流水先上的每一个数据System.out.println(s);}});*/list.stream().forEach(s-> System.out.println(s));}
}

2.双列集合 

package mystream;import java.util.HashMap;public class StreamDemo2 {public static void main(String[] args) {//双列集合 无 无法直接使用stream流//1.创建双列集合HashMap<String, Integer> hm = new HashMap<>();//2.添加数据hm.put("zhangsan", 23);hm.put("lisi", 24);hm.put("wangwu", 25);hm.put("zhaoliu", 26);hm.put("tianqi", 27);//3.第一种获取stream流(键)hm.keySet().forEach(s -> System.out.println(s));//4.第二种获取stream流(键值对)hm.entrySet().stream().forEach(s -> System.out.println(s));}
}

3.数组

package mystream;import java.util.Arrays;public class StreamDemo3 {public static void main(String[] args) {//数组 public static <T> Stream<T> stream(T[] array) Arrays工具类中的静态方法//1.创建数组int[] arr1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};String[] arr2 = {"zhangsan", "lisi", "wangwu", "zhaoliu", "tianqi"};//2.获取stream流Arrays.stream(arr1).forEach(s -> System.out.println(s));System.out.println("==================================");Arrays.stream(arr2).forEach(s -> System.out.println(s));}
}

 4.一堆零散数据

package mystream;import java.util.stream.Stream;public class StreamDemo4 {public static void main(String[] args) {//一堆零散数据 public static<T> Stream<T> of(T... values) stream接口中的金泰方法Stream.of(1,2,3,4,5).forEach(s -> System.out.println(s));System.out.println("======================");Stream.of("zhangsan","lisi","wangwu","zhaoliu","tianqi").forEach(s -> System.out.println(s));}
}

 

注意:
Stream接口中静态方法of的细节
方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
但是数组必须是引用数据类型的,如果传递基本数据类型,是会把整个数组当做一个元Stream当中。

Stream中的中间方法

注意:

去重的如果时基本数据类型或者引用数据类型,java已经重写好了hashCode和equals方法,可以直接使用

如果是自定义对象,则需要手动重写hashCode和equals方法

合并时两个流a,b的数据类型要保持一致

如果不一致,合并的流的数据类型是a和b的父类

1.过滤,获取,跳过

package mystream;import java.util.ArrayList;
import java.util.Collections;public class StreamDemo5 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");/*list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(System.out::println);*///list.stream().limit(3).forEach(s->System.out.println(s));//list.stream().skip(4).forEach(s->System.out.println(s));list.stream().skip(3).limit(3).forEach(s->System.out.println(s));}
}

2.去重,合并

package mystream;import java.util.ArrayList;
import java.util.Collections;
import java.util.stream.Stream;public class StreamDemo6 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张无忌","张无忌","张无忌" ,"周芷若", "赵敏", "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");ArrayList<String> list2 = new ArrayList<>();Collections.addAll(list2, "周芷若", "赵敏");//distinct 元素去重,依赖hashCode和equals方法//list.stream().distinct().forEach(s->System.out.println(s));Stream.concat(list.stream(),list2.stream()).forEach(s->System.out.println(s));}
}

3.类型转换

package mystream;import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;public class StreamDemo7 {public static void main(String[] args) {ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"张无忌-15","周芷若-14","赵敏-13","张强-20","张三丰-100","张翠山-40","张良-35","王二麻子-37","谢广坤-41");//需求:只获取里面的年龄并进行打印//String->int//第一个类型:流中原本的数据类型//第二个类型:转换之后的数据类型//apply的形参s:依次表示流里面的每一个数据//返回值:表示转换之后的数据//当map方法执行完毕之后,流上的数据就变成了整数//所以在下面forEach当中,s依次表示流里面的每一个数据,这个数据现在就是整数了list.stream().map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {String[] arr = s.split("-");String ageStr = arr[1];int age = Integer.parseInt(ageStr);return age;}}).forEach(s->System.out.println(s));System.out.println("-----------------------------");//简化list.stream().map(s->Integer.parseInt(s.split("-")[1])).forEach(s->System.out.println(s));}
}

Steam中的终结方法

终结方法的返回值不是Strea对象,可以理解为终结方法没有返回值,所以无法调用其他的方法

前三种方法

package mystream;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;public class StreamDemo8 {public static void main(String[] args) {/*void forEach(Consumer action) 遍历long count() 统计toArray() 收集流中的数据,放到数组中*/ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张无忌", "周芷若", "赵敏", "张强", "张三丰", "张翠山", "张良", "王二麻子", "谢广坤");//遍历//list.stream().forEach(s -> System.out.println(s));//统计//long count = list.stream().count();//System.out.println(count);// toArray() 收集流中的数据,放到数组中//IntFunction的泛型:具体类型的数组//app1y的形参:流中数据的个数,要跟数组的长度保持一致//apply的返回值:具体类型的数组//方法体:就是创建数组//toArray方法的参数的作用:负责创建一个指定类型的数组//toArray方法的底层,会依次得到流里面的每一个数据,并把数据放到数组当中//toArray方法的返回值:是一个装着流里面所有数据的数组/*String[] arr = list.stream().toArray(new IntFunction<String[]>() {@Overridepublic String[] apply(int value) {return new String[value];}});System.out.println(Arrays.toString(arr));*/String[] arr = list.stream().toArray(value -> new String[value]);System.out.println(Arrays.toString(arr));}
}

收集到集合

package mystream;import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;public class StreamDemo9 {public static void main(String[] args) {/*collect(collector collector) 收集流中的数据,放到集合中(List Set Map)注意点:如果我们要收集到map集合当中,键不能重复,否则会报错*/ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"张无忌-男-15", "周芷若-女-14", "赵敏-女-13", "张强-男-20", "张三丰-男-100", "张翠山-男-40", "张良-男-50", "王二麻子-男-30", "谢广坤-男-16");//收集List集合当中//需求//把所有的男性收集起来List<String> newList = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toList());//System.out.println(newList);//收集Set集合当中//需求//把所有的男性收集起来Set<String> newSet = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toSet());//System.out.println(newSet);//收集Map集合当中//谁做键,谁做值//把所有的男性收集起来//键:姓名  值:年龄Map<String, Integer> map = list.stream().filter(s -> "男".equals(s.split("-")[1]))/*toMap :参数一表示键的生成规则参数二表示值的生成规则参数一:Function泛型一:表示流中每一个数据的类型泛型二:表示Map集合中键的数据类型方法apply形参:依次表示流里面的每一个数据方法体:生成键的代码返回值:已经生成的键参数二:Function泛型一:表示流中每一个数据的类型泛型二:表示Map集合中值的数据类型方法apply形参:依次表示流里面的每一个数据方法体:生成值的代码返回值:已经生成的值*/.collect(Collectors.toMap(new Function<String, String>() {@Overridepublic String apply(String s) {return s.split("-")[0];}},new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return Integer.parseInt(s.split("-")[2]);}}));Map<String, Integer> map2 = list.stream().filter(s-> "男".equals(s.split("-")[1])).collect(Collectors.toMap(s -> s.split("-")[0],s -> Integer.parseInt(s.split("-")[2])));System.out.println(map);}
}

总结

练习

1.

package mystream;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;public class StreamDemo10 {public static void main(String[] args) {//1.定义一个集合ArrayList<Integer> list = new ArrayList<>();//2.添加一些整数Collections.addAll(list,1,2,3,4,5,6,7,8,9,10);//过滤奇数,只留下偶数//进行判断,如果是偶数,返回true,保留List<Integer> collect = list.stream().filter(s -> s%2 == 0).collect(Collectors.toList());//4.打印集合System.out.println(collect);}
}

 2.

package mystream;import java.util.ArrayList;
import java.util.Collections;
import java.util.Map;
import java.util.stream.Collectors;public class StreamDemo11 {public static void main(String[] args) {//1.定义一个集合ArrayList<String> list = new ArrayList<>();//2.添加元素Collections.addAll(list,"zhangsan,23","lisi,24","wangwu,25");//3.保留年龄大于等于24的人,并将结果收集到map集合当中,姓名为键,年龄为值Map<String, Integer> collect = list.stream().filter(s -> Integer.parseInt(s.split(",")[1]) >= 24).collect(Collectors.toMap(s -> s.split(",")[0],s -> Integer.parseInt(s.split(",")[1])));//4.打印结果System.out.println(collect);}
}

3.

package mystream;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class StreamDemo12 {public static void main(String[] args) {//1.创建两个ArrayList集合,用来储存演员数据ArrayList<String> manlist = new ArrayList<>();ArrayList<String> womenlist = new ArrayList<>();//2.往两个集合中添加数据Collections.addAll(manlist,"蔡坤坤,24","叶齁咸,23","刘不甜,22","吴签,24","谷嘉,30","肖梁,27");Collections.addAll(womenlist,"赵小颖,35","杨颖,36","高元元,43","张天天,31","刘诗,35","杨小幂,33");//3.男演员,只要名字为三个字的前两人Stream<String> stream1 = manlist.stream().filter(s -> s.split(",")[0].length() == 3).limit(2);//4.女演员只要姓杨的,并且不要第一个Stream<String> stream2 = womenlist.stream().filter(s -> s.split(",")[0].startsWith("杨")).skip(1);//5.把过滤后的男演员姓名和女演员姓名合并在一起,保存在在一个list集合中List<Actor> list = Stream.concat(stream1, stream2).map(s -> new Actor(s.split(",")[0], Integer.parseInt(s.split(",")[1]))).collect(Collectors.toList());System.out.println(list);}
}
package mystream;public class Actor {private String name;private int age;public Actor() {}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public Actor(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Actor{" +"name='" + name + '\'' +", age=" + age +'}';}
}

相关文章:

  • 【高阶数据结构】第三弹---图的存储与遍历详解:邻接表构建与邻接矩阵的BFS/DFS实现
  • PasteForm框架开发之Entity多级嵌套的表单的实现
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第八讲)
  • jupyter中切换Anaconda虚拟环境
  • 自定义类型之结构体
  • Charles 安装与使用详解:实现 App 与小程序 HTTPS 抓包
  • Linux进程
  • 网络协议TCP/IP、UDP、HTTP/HTTPS 完全指南
  • 数据库学习通期末复习一
  • C# + Python混合开发实战:优势互补构建高效应用
  • Day09【基于Tripletloss实现的简单意图识别对话系统】
  • Android学习总结之git篇
  • 根据pdf文档生成问答并进行评估
  • 集成电路流片随笔10:UART模块tinyriscv 通信协议和RIB接口总线区别
  • 【day5】调用AI接口,生成自动化测试用例
  • JVM 垃圾回收
  • 一个简单的Python文件MCP服务器
  • OpenAI 最新发布的 GPT-4.1 系列在 API 中正式上线
  • Google-Tensorflow-NLP
  • NLP高频面试题(四十三)——什么是人类偏好对齐中的「对齐税」(Alignment Tax)?如何缓解?
  • 顾家家居:拟定增募资近20亿元,用于家居产品生产线的改造和扩建等
  • 绿城房地产集团:近半年累计花费20.6亿元购买旗下债券
  • 光大华夏:近代中国私立大学遥不可及的梦想
  • 关税风暴下,3G资本拟94亿美元私有化美国鞋履巨头斯凯奇,溢价30%
  • 巴基斯坦军方:印度导弹袭击已造成至少3死14伤
  • 无人机穿越大理崇圣寺千年古塔时“炸机”,当地:肇事者已找到,将被追责