day20和21天学习

day20和21天学习

##20
处理资源关闭的语法
try(AutoCloseable 资源 =…){

} catch(IOException e) {
}
//finally 块没有了
idea中可以用 .twr添加这个语法补全new BufferedReader((())))
ctrl Alt m抽取方法
day20 反射
定义:在运行期间,可以获取对象的类型,类型的方法,类型的属性,类型的构造方法(总结为让对象认识自身的结构)

获取对象类型(类对象)
方法一:Object .getClass得到实际类
方法二:class.forName(“类名”)
方法三:类名.class
方法一 = 方法二这个类型信息在jvm仍表现为一个对象,而且只有一份

类对象的功能

1)用反射方式创建对象
正常创建对象:new 类名();
反射创建对象:类对象.newInstance();//创建一个新实例(对象)限制1:要求对象有无参构造 限制2:构造方法不能私有
在这里插入图片描述
2)获取方法信息
类对象.getMethods(); //获取所有公共方法(public),包括继承
类对象.getDeclaredMethods();//获取本类的所有方法(public,private,protected,不加)
(带Declare本类的不带公共的)
类对象.getMethod(方法名,参数类型);//找公共方法,包括继承
类对象.getDeclaredMethod(方法名,参数类型);//找本类的,不包括继承

3)获取属性信息(了解)
类对象.getFields();//获取所有公共属性包括继承
类对象.getDeclaredFields();//获取本类所有的属性(private public protected 不加)(不包括继承)
在这里插入图片描述
类对象.getField(“属性名”);
类对象.getDeclaredFields(“属性名”);
4)获取构造方法(了解)
类对象.getConstructors();//获取所有公共的构造方法
类对象.getDeclaredConstructors();//获取本类所有的构造方法
类对象.getConstructor(int.class);//获取int参数类型的构造
类对象.getConstructor;//获得无参构造

5)反射调用法(比正常性能低)
正常调用方式:对象.方法名(参数)
反射调用方式:方法.invoke(对象,参数);
在这里插入图片描述
**缺点:**调用复杂,效率低
**优点:**可以调用私有方法,突破正常方法的限制,经常用在开源框架中
1) 获得多个方法
在这里插入图片描述
2)获取名为getId的方法
3)获取带两个int参数的 setId
在这里插入图片描述
4)调用 p.setId(20)
在这里插入图片描述
5)反射调用有参构造
在这里插入图片描述

##day21
1.Stream API 从1.8引入的api
2.都和集合有关

List list = new ArrayList<>();
list.add(1);
list.add(2);

List list = Arrays.asList(1,2,3,4,5)
题略写一个方法找出偶数,返回一个新的list包含结果

在这里插入图片描述

3.接口
Predicate 断言接口
对应一个 lambda 一个参数,返回结果是boolean
(a) -> { return true|false; }
Function 函数接口
对应一个 lambada 一个参数,一个返回结果,参数和返回结果的类型可以不一样
BiPredicate 双参数断言
对应 lambda 两个参数,返回结果式boolean
(a, b) -> { return true|false; }
Bifunction 双参数函数接口
两个参数,一个结果
(a,b) -> { 根据ab返回一个结果 }
Consumer 消费接口
一个参数,没有结果
(a) -> { 不需要 return }
BiConsumer 双参数消费接口
两个参数,没有结果
Supplier 生产者接口
没有参数,返回一个结果
() -> { return 结果 }
(ctrl+鼠标左键跳转)

#Stream api
1.filter 进行过滤的,lambda返回ture会留下,lambda返回为假的过滤掉
2.map 映射的,lambda把原有的元素转化为另一个元素,不会改变个数
3.flatMap扁平化映射
在这里插入图片描述
4.for each遍历流,接受一个Consumer
在这里插入图片描述
5.map的遍历
在这里插入图片描述

1)求个数和去重复
在这里插入图片描述
2)只调用带比较器的最大最小方法
3)把包装类型的流,变成基本类型的流
在这里插入图片描述
Stream api中有一个重要思想:把流中的数据一个接一个进行处理,每个数据会经过后续filter,map等方法一次调用

在整个过程中,lambda表达式式懒惰的,不执行终结方法的话,不会触发lambda的执行

终结方法:collect,sum,max,min…
运算过程中不会改变原始集合,收集器会生成新的集合对象

====================
流的生成
1.用集合
list.stream();
2.根据数字
IntStream.of(1,2,3,4);
3.把数组变成流
Arrays.stream(数组);

4.把文件中的每一行读取出来作为流元素
####方法引用
当逻辑简单时用lambda 复杂时候用方法引用
对lambda表达式的扩展
第一种: 对象::方法名
例子:System.out::println
第二种: 类名::静态方法名
在这里插入图片描述
第三种: 类名::new
可以取代Supplier接口的lambda
例如 () -> new Student()
可以替换为 : Student::new

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值