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

【Java学习|黑马笔记|Day18】Stream流|获取、中间方法、终结方法、收集方法

文章目录

    • 【DAY18】
      • 不可变集合
      • 一.Stream流
        • 1.1)获取Stream流
        • 1.2)中间方法
        • 1.3)终结方法
        • 1.4)收集方法collect

【DAY18】

不可变集合

  • 如果某个数据不能被修改,把它拷贝到不可变集合中
  • 当集合对象不被可信的库调用时不可变形式是安全的

创建不可变集合的书写格式

方法名称说明
static list of(E…elements)创建一个具有指定元素的List集合对象
static Setof(E…elements)创建一个具有指定元素的Set集合对象
static<K,V> Map<K,V> of(E…elements)创建一个具有指定元素的Map集合对象
List<String> list = List.of("a","b","c","d");
//参数要保持唯一性
System.out.println(list.get(0));
System.out.println(list.get(1));
System.out.println(list.get(2));
System.out.println(list.get(3));
for (String s : list) {System.out.println(s);
}
//细节:键不能重复,参数有上限,最多只能传递10个键值对
Map<String,String> map = Map.of("a","b","c","d","e","f");
Set<String> keys = map.keySet();
for (String key : keys) {System.out.println(key + "=" + map.get(key));
}
//创建Map的不可变集合,键值对的数量超过10个
//1.创建一个普通的Map集合
HashMap<String, String> hm = new HashMap<>();
hm.put("a","1");
hm.put("b","2");
hm.put("c","3");
hm.put("d","4");
hm.put("e","5");
hm.put("f","6");
hm.put("g","7");
hm.put("h","8");
hm.put("i","9");
//2.利用上面数据获取一个不可变的集合
//获取到所有的键值对对象(Entry对象)
Set<Map.Entry<String, String>> entries = hm.entrySet();
//把entries变成一个数组
Map.Entry[] arr1 = new Map.Entry[0];
//toArray方法在底层会比较集合的长度跟数组的长度两者的大小
//如果集合的长度 > 数组的长度 :数据在数组中放不下,此时会根据实际数据的个数,重新创建数组
//如果集合的长度 <= 数组的长度:数据在数组中放的下,此时不会创建新的数组,而是直接用//简化
Map<String,String> map = Map.copyOf(hm);

在这里插入图片描述

一.Stream流

可理解为把一堆数据放到一个流水线上

作用:结合Lambda表达式,简化集合、数组的操作

1.1)获取Stream流

Stream流的使用步骤

  1. 先得到一条Stream流,并把数据放上去

    在这里插入图片描述

  2. 使用中间方法进行操作

  3. 使用终结方法进行操作

//单列集合获取Stream流
ArrayList<String> list = new ArrayList();
Collections.addAll(list,"a","b","c","d","e","f","g");
/*Stream<String> stream1 = list.stream();
stream1.forEach(new Consumer<String>() {@Overridepublic void accept(String s) {System.out.println(s);}
});*/
list.stream().forEach(s -> System.out.println(s));
//双列集合获取Stream流
HashMap<String, Integer> hm = new HashMap<>();
hm.put("a",1);
hm.put("b",2);
hm.put("c",3);
hm.put("d",4);
//第一种 键
hm.keySet().stream().forEach(s -> System.out.println(s));
//第二种 键值对
hm.entrySet().stream().forEach(s -> System.out.println(s));
//数组的Stream流
int[] arr = {1,2,3,4,5,6};
Arrays.stream(arr).forEach(s -> System.out.println(s));
String[] arr2 = {"a","b","c","d","e","f","g"};
Arrays.stream(arr2).forEach(s -> System.out.println(s));
//一堆零散数据
Stream.of(1,2,3,4,5,6,7,8,9).forEach(s -> System.out.println(s));
Stream.of("aa","bb","cc","dd").forEach(s -> System.out.println(s));
1.2)中间方法

在这里插入图片描述

filter

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"a","abc","ca","dc","ae","fs","gs");
//filter 过滤 留下以a开头的/*list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {//如果返回true 表示当前的要留下 反之不要return s.startsWith("a");}}).forEach(s -> System.out.println(s));*///简化//list.stream().filter(s -> s.startsWith("a")).forEach(s -> System.out.println(s));//筛选a开头且长度为三的Stream<String> stream1 = list.stream().filter(s ->s.startsWith("a"));Stream<String> stream2 = stream1.filter(s -> s.length() == 3);stream2.forEach(s -> System.out.println(s));//化简list.stream().filter(s -> s.startsWith("a")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));

limit 和 skip

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "a", "abc", "ca", "dc", "ae", "fs", "gs");//limit 获取前几个元素
list.stream().limit(3).forEach(s -> System.out.println(s));//skip 跳过前几个元素
list.stream().skip(3).forEach(s -> System.out.println(s));

distinct

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "a","a","abc", "abc", "ca", "dc", "ae", "fs", "gs");
//去重 依赖hashCode和equals
list.stream().distinct().forEach(s ->System.out.println(s));

concat

ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "a","a","abc", "abc", "ca", "dc", "ae", "fs", "gs");
ArrayList<String> list2 = new  ArrayList<>();
Collections.addAll(list2, "a","a","abc", "abc", "ca", "dc", "ae", "fs", "gs");
Stream.concat(list.stream(), list2.stream()).forEach(s -> System.out.println(s));

map

ArrayList<String> list = new ArrayList<>();
//要求:只要数字
Collections.addAll(list, "a-11","a-12","abc-23", "abc-3", "ca-3", "dc-34", "ae-45", "fs-87", "gs-49");//String 转 Integer
list.stream().map(new Function<String, Integer>() {//第一个类型 流中原本的数据//第二个类型 要转变之后的类型//apply的形参 依次表示流里面每一个数据//返回值 表示转换之后的数据@Overridepublic Integer apply(String s) {String[] arr = s.split("-");String ageString = arr[1];//获取后面部分int age = Integer.parseInt(ageString);//转成Integerreturn age;}
}).forEach(s -> System.out.print(s + " "));
System.out.println();//简化
list.stream().map(s -> Integer.parseInt(s.split("-")[1])).forEach(s -> System.out.print(s + " "));
1.3)终结方法

在这里插入图片描述

forEach

ArrayList<String> list = new ArrayList();
Collections.addAll(list,"a","b","c","d","e","f","g");
//遍历
//Consumer的泛型:表示流中数据的类型
//accept方法的形参:依次表示流里面是每一个数据
list.stream().forEach(new Consumer<>() {@Overridepublic void accept(String s){System.out.println(s);}
});list.stream().forEach(s -> System.out.println(s));

count

ArrayList<String> list = new ArrayList();
Collections.addAll(list,"a","b","c","d","e","f","g");
//统计 long类型
long count = list.stream().count();
System.out.println(count);//7

toArray

ArrayList<String> list = new ArrayList();
Collections.addAll(list,"a","b","c","d","e","f","g");
//toArray 收集流中数据并放到数组中
Object[] arr1 = list.stream().toArray();
System.out.println(Arrays.toString(arr1));//[a, b, c, d, e, f, g]//IntFunction的泛型:具体类型的数组
//apply的形参:流中数据的个数,要跟数组的长度保持一致
//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[] arr2 = list.stream().toArray(value ->new String[value]);
System.out.println(Arrays.toString(arr2));
1.4)收集方法collect
//需求:收集所有的女性ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"z-女-11", "a-男-12","f-女-15","e-男-43", "e-男-11","w-女-92","o-男-11");//收集到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);
http://www.dtcms.com/a/288891.html

相关文章:

  • 【Linux】2. Linux下的C/C++开发环境
  • 【UE5医学影像可视化】读取dicom数据生成2D纹理并显示
  • pytest-log
  • 嵌入式Linux:获取线程ID
  • 数组算法之【合并两个有序数组】
  • 137. Java 泛型 - 泛型与通配符:子类型化关系
  • 【Linux】权限详解 权限本质、权限属性、su、sudo提权、chmod\chown\chgrp、文件类别
  • RxSwift-事件属性
  • Vuex 核心知识详解:Vue2Vue3 状态管理指南
  • Servlet快速入门
  • Docker在NAS部署MoonTV+OrionTV
  • 44.sentinel授权规则
  • tidyverse-数据读入
  • 基于智慧经营系统的学校住宿登记报表分析与应用探究-毕业论文—仙盟创梦IDE
  • 如何防止任务长期处于“等待”状态
  • Python基础和高级【抽取复习】
  • 基于单片机的自动条幅悬挂机
  • Leetcode 06 java
  • SpringBoot的配置文件
  • 【micro:bit】从入门到放弃(四):高级指令:函数、数组、文本、高级LED、引脚配置
  • UE蒙太奇和动画序列有什么区别?
  • 早期SD模型控制生成方法
  • Dev-C++——winAPI贪吃蛇小游戏
  • 智能制造之物料详解
  • 物联网安装调试-温湿度传感器
  • 数学专业转行做大数据容易吗?需要补什么?
  • 高性能熔断限流实现:Spring Cloud Gateway 在电商系统的实战优化
  • 本地部署 Claude 大语言模型的完整实践指南
  • 从磁记录到数据中心:磁盘原理与服务器架构的完整技术链路
  • 【C++基础】面试高频考点解析:extern “C“ 的链接陷阱与真题实战