反射
反射
关于java.lang.class 类的理解
类的加载过程
程序经过javac.exe 命令以后,会生成一个或多个字节码文件,接着我们使用java.exe命令对某个字节码文件进行解释运行。相当于将某个字节码文件加载到内存中,此过程称为类的加载。加载到内存中的类,我们就称为运行时类,此运行时类,就作为class的一个实例。
读取配置文件
创建运行时类的对象
getMetods(); 获取当前运行时类及其所有父类中声明为public权限的方法
getDeclaredMethods() ;获取当前运行时类中声明的所有方法。(不包含父类中声明的方法)
获得指定内容
属性值
方法
方法
Lambda表达式的使用
1.举例 (o1,o2) -> compare(o1,o2)
左边:形参列表(其实就是接口中的抽象方法的形参列表)。参数类型可以省略;只有一个参数,可以省略小括号;
右边:lambdat体 其实就是重写的抽象方法的方法体。
四大函数式接口
消费型接口 Consumer<T> void accept(T t)
供给型接口 Supplier<T> T get()
函数型接口 Function<T,R> R apply(T t)
断定型接口 Predicate<T> boolean test(T t)
方法引用
使用情景:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口的实例。所以方法引用,也是函数式接口的实例。
使用格式: 类(或对象) :: 方法名
具体分为如下的三种情况
对象 :: 非静态方法
类 :: 静态方法
类 :: 非静态方法
方法引用使用的要求:要求接口中的抽象方法的参数列表和返回值类型与方法引用的方法的形参列表和返回值类型相同,对情况1和情况2;
Stream
Stream关注的是对数据的运算,与CPU打交道。集合关注的是数据的存储,与内存打交道
自己不会存储元素
不会改变源对象。相反,他们会返回一个持有结果的新Stream。
操作是延迟执行的。这意味着他们会等到需要结果的时候才执行
Stream 执行流程
Stream的实例化
一系列的中间操作(过滤、映射、...)
终止操作
说明
一个中间操作链,对数据源的数据进行处理
一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用。
筛选与切片
filter(Predicate p) -- 从流中排除某些元素
limit(n) ; 截断流,使其元素不超过给定数量
skip(n); 跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个
distinct : 筛选,通过流所生成元素的hashcode()和equals()去除重复元素
映射
map(Function f) -- 接收一个函数作为参数,将元素转换成其他形式或提取信息,该函数会被应用到每个元素上,并将其映射成一个新的元素
flatMap(Fuction f) 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
排序
终止操作
匹配与查找
allMatch(Predicate p) 检查是否匹配所有元素
anyMatch(Predicate p) 检查是否至少匹配一个元素
noneMatch(Predicate p) 价差是否没有匹配的元素
findFirst :返回第一个元素
findAny : 返回当前流中的任意元素
count : 返回流中的任意元素
max(Comparator c) :返回流中最大值
归约
reduce(T identity,BinaryOperator) 可以将流中元素反复结合起来,得到一个值。返回这个值
redece(BinaryOperator) : 可以将流中元素反复结合起来,得到一个值。返回Optional<T>
收集
collect(Collector c) : 将流转换为其他形式。接收一个Collector 接口的实现,用于给Stram中的元素做汇总的方法