计算机网络
-
HTTP 缓存
-
你知道 302 状态码是什么嘛?你平时浏览网页的过程中遇到过哪些 302 的场景?
-
HTTP 常用的请求方式,区别和用途?
-
HTTPS 是什么?具体流程
-
三次握手和四次挥手
-
你对 TCP 滑动窗口有了解嘛?
-
WebSocket与Ajax的区别
-
了解 WebSocket 嘛?
-
HTTP 如何实现长连接?在什么时候会超时?
-
TCP 如何保证有效传输及拥塞控制原理。
-
TCP 协议怎么保证可靠的,UDP 为什么不可靠?
开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】
算法
-
链表
-
字符串
-
数组问题
-
二叉树
-
排序算法
-
二分查找
-
动态规划
-
BFS
-
栈
-
DFS
-
回溯算法
细节: 一堆零散数据需要是相同的数据类型。
public class StreamTest {
public static void main(String[] args) {
//零散数据获取Stream流
//基本数据类型
Stream.of(1,2,3,4,5).forEach(s -> System.out.println(s));
//引用数据类型
Stream.of("a","b","c","d","e").forEach(s -> System.out.println(s));
}
}
2. Stream流的中间方法
方法名称 | 说明 |
---|---|
Stream filter ( Predicate<? super T> predicate ) | 过滤 |
Stream filter ( Predicate<? super T> predicate ) | 获取前几个元素 |
Stream skip ( long n ) | 跳过前几个元素 |
Stream distinct ( ) | 元素去重,依赖(hashCode和equals方法) |
static Stream concat ( Stream a , Stream b ) | 合并a和b两个流为一个流 |
Stream map ( Function<T ,R> mapper ) | 转换流中的数据类型 |
注意一:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程。
注意二:修改Stream流中的数据,不会影响原来集合或者数组中的数据。
public class StreamTest01 {
public static void main(String[] args) {
//1.过滤:把开头的留下,其余数据过滤不要
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张三","李四","王五","赵六","张七");
ArrayList<String> list2 = new ArrayList<>();
Collections.addAll(list2, "张三","李四","王五","赵六","张三");
ArrayList<String> list3 = new ArrayList<>();
Collections.addAll(list3, "孙七","钱八");
ArrayList<String> list4 = new ArrayList<>();
Collections.addAll(list2, "张三-23","李四-24","王五-25");
list.stream().filter(new Predicate<String>() {
//匿名内部类太麻烦 需要缩写
@Override
public boolean test(String s) {
//如果返回值为true,表示当前数据留下
//如果返回值为false,表示当前数据舍弃
return s.startsWith("张");
}
}).forEach(s -> System.out.println(s)); //张三 张七
list.stream()
.filter(s -> s.startsWith("张"))
.forEach(s -> System.out.println(s));
//2. 获取前几个元素
list.stream()
.limit(3)
.forEach(s -> System.out.println(s)); //张三 李四 王五
//3. 跳过
list.stream()
.skip(4)
.forEach(s -> System.out.println(s)); //张七
//4.去重
list2.stream()
.distinct()
.forEach(s -> System.out.println(s)); //张三 李四 王五 赵六
//5. 合并
Stream.concat(list2.stream(), list3.stream())
.forEach(s -> System.out.println(s));
//6.转换数据类型
//只能获取集合里面的年龄并打印
//第一个类型:流中原本的数据类型
//第二个类型:将要转变成为的数据类型
list4.stream().map(new Function<String,Integer>() {
@Override
//apply: 依次表示流中的每一盒数据
//返回值:表示转化之前的数据
public Integer apply(String s) {
String[] arr = s.split("-");
String ageString = arr[1];
int age = Integer.parseInt(ageString);
return age;
}
}).forEach(s -> System.out.println(s));
list.stream()
.map(s ->Integer.parseInt(s.split("-")[1]))
.forEach(s -> System.out.println(s));
}
}
3. Stream流的终结方法
方法名称 | 说明 |
---|---|
void forEach ( Consumer action ) | 遍历 |
long count ( ) | 统计 |
toArray ( ) | 收集流中的数据,放到数组中 |
collect ( Collector collector ) | 收集流中的数据,放到集合中 |
public class StreamTest02 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张三", "李四", "王五", "赵六");
// 遍历
// Consumer的泛型:表示流中的数据类型
// accept方法的形参s:依次表示流中的每一个数据
//
list.stream().forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
list.stream().forEach(s -> System.out.println(s)); // 张三 李四 王五 赵六
// 统计
long count = list.stream().count();
System.out.println(count); // 4
// 收集数据放进数组
Object[] arr1 = list.stream().toArray();
System.out.println(Arrays.toString(arr1)); // [张三, 李四, 王五, 赵六]
// 指定数据类型
// Infunction的泛型:具体类型的数组
// apply中形参:流中数据的个数,要跟数组长度一致
// apply的返回值:具体类型的数组
String[] arr2 = list.stream().toArray(new IntFunction<String[]>() {
@Override
public String[] apply(int value) {
return new String[value];
}
});
// toArray方法中的参数:只是创建一个指定类型的数组
// toArray底层: 会此意得到流中的每一个数据,并把数据放到数组中
// toArray的返回值:是一个装着流里面所有数据的数组
System.out.println(Arrays.toString(arr2));
// lambda表达式
String[] arr3 = list.stream().toArray(value -> new String[value]);
System.out.println(Arrays.toString(arr3));
}
}
collect方法:
public class StreamTest {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list, "张三-男-23", "李四-男-24",
"王五-男-25", "赵六-女-27", "孙八-女-28");
//收集到List集合当中
//需求:
//将所有的男性收集起来
List<String> newList = list.stream()
.filter(s-> "男".equals(s.split("-")[1]))
.collect(Collectors.toList());
System.out.println(newList); //[张三-男-23, 李四-男-24, 王五-男-25]
//收集到Set集合当中
Set<String> newSet = list.stream()
.filter(s-> "男".equals(s.split("-")[1]))
.collect(Collectors.toSet());
System.out.println(newSet);
//收集到Map集合当中
//键: 姓名 值: 年龄
//toMap:
//参数一表示键的生成规则 参数二表示值得生成规则
//参数一:
//Function泛型一:表示流中每一个数据的类型 ;
// 泛型二:表示Map集合中键的数据类型
//方法apply 形参:一次表示流里面的每一个数据
// 方法体:生成键的代码
// 返回值:已生成的键
//参数二:
//Function泛型一:表示流中每一个数据的类型 ;
// 泛型二:表示Map集合中值的数据类型
//方法apply 形参:一次表示流里面的每一个数据
// 方法体:生成值的代码
// 返回值:已生成的值
Map<String, Integer> newMap = list.stream()
.filter(s-> "男".equals(s.split("-")[1]))
.collect(Collectors.toMap(new Function<String, String>() {
@Override
public String apply(String s) {
return s.split("-")[0];
}
}, new Function<String, Integer >() {
@Override
public Integer apply(String s) {
return Integer.parseInt(s.split("-")[2]);
}
}));
System.out.println(newMap); //{李四=24, 张三=23, 王五=25}
//lambda表达式
Map<String, Integer> newMap1 = list.stream()
.filter(s-> "男".equals(s.split("-")[1]))
.collect(Collectors.toMap(
s-> s.split("-")[0],
s-> Integer.parseInt(s.split("-")[2])));
System.out.println(newMap1);
}
}
四、 练习
1. 数据过滤
需求:
定义一个集合,并添加一些整数1,2,3,4,5,6,7,8,9,10
过滤奇数,只留下偶数。
并将结果保存起来
public class StreamDemo {
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);
// 3.过滤奇数,只留偶数
// 进行判断,如果是偶数,返回true
List<Integer> list2 = list.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
System.out.println(list2); //[2, 4, 6, 8, 10]
}
}
2. 数据操作 - 按年龄筛选
需求:
创建一个ArrayList集合,并添加以下字符串,字符串中前面是姓名,后面是年龄
“zhangsan,23”
“lisi,24"
“wangwu,25”
保留年龄大于等于24岁的人,并将结果收集到Map集合中,姓名为键,年龄为值
public class StreamDemo {
public static void main(String[] args) {
// 1.定义一个集合
ArrayList<String> list = new ArrayList<>();
//2.集合添加字符串
list.add( "zhangsan,23");
list.add("lisi,24");
list.add("wangwu,25");
//3.保留年龄大于24岁的人
Map<String, Integer> map = list.stream()
.filter(s -> Integer.parseInt(s.split(",")[1]) >= 24)
.collect(Collectors.toMap(
s -> s.split(",")[0],
s -> Integer.parseInt(s.split(",")[1])));
System.out.println(map); //{lisi=24, wangwu=25}
}
}
3. 数据操作 - 演员信息要求筛选
现在有两个ArrayList集合,
第一个集合中:存储6名男演员的名字和年龄。第二个集合中:存储6名女演员的名字和年龄。姓名和年龄中间用逗号隔开。比如:张三,23
要求完成如下的操作:
男演员只要名字为3个字的前两人
女演员只要姓杨的,并且不要第一个
把过滤后的男演员姓名和女演员姓名合并到一起
将上一步的演员信息封装成Actor对象。
将所有的演员对象都保存到List集合中。
备注:演员类Actor,属性有:name,age
public class StreamDemo {
public static void main(String[] args) {
// 1.定义两个集合
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. 男演员只要名字为3个字的前两个人
**ES6**
* 列举常用的ES6特性:
* 箭头函数需要注意哪些地方?
* let、const、var
* 拓展:var方式定义的变量有什么样的bug?
* Set数据结构
* 拓展:数组去重的方法
* 箭头函数this的指向。
* 手写ES6 class继承。
![](https://img-blog.csdnimg.cn/img_convert/aac1740e50faadb9a6a7a5b97f9ccba8.png)
**[开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】](https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0)**
**微信小程序**
* 简单描述一下微信小程序的相关文件类型?
* 你是怎么封装微信小程序的数据请求?
* 有哪些参数传值的方法?
* 你使用过哪些方法,来提高微信小程序的应用速度?
* 小程序和原生App哪个好?
* 简述微信小程序原理?
* 分析微信小程序的优劣势
* 怎么解决小程序的异步请求问题?
![](https://img-blog.csdnimg.cn/img_convert/60b1dbe5c76e264468aa993416a9a031.png)