本帖最后由 小北京 于 2018-12-2 17:10 编辑
常用的流操作
获取流对象 集合->流:集合对象.stream() 数组->流:Stream.of(数组)
Stream方法:
延迟方法:
Stream filter(Predicate p): 过滤
Stream map(Function f): 转换映射
Stream limit(long n): 只要前n个
Stream skip(long n): 不要前n个
终结方法:
long count(): 返回流中元素的个数
void forEach(Consumer c): 遍历消费每个元素
静态方法:
Stream concat(Stream s1, Stream s2): 合并流
(扩展: 收集器)
Stream不是集合,也不是数组,也不是某种数据结构,所以Stream内部不能存储元素,Stream是一种函数模型
方法引用基本
对象的成员方法: 对象名::成员 person::eat
方法名静态方法: 类名::静态方法名 Math::abs
父类的方法: super::成员方法名 super::eat
本类的方法: this::成员方法名 this::eat
类和数组的构造器引用
引用某个类的构造方法: 类名::new Person::new
引用创建数组的方法 数据类型[]:new int[]::new
JUnit 反射 注解
JUnit单元测试: 测试一个方法有没有问题, 是否能否按照我们设计的方式运行 (不用main方法直接运行)
反射
反射: 概述
框架:
半成品软件. 可以在框架的基础上进行软件开发, 简化编码
比如JUnit就是一个单元测试框架, 它不是一个独立的软件, 而是和我们开发的软件结合, 简化代码测试
反射: 将类的各个组成部分, 封装为其他对象, 这就是反射机制
成员变量(字段): Field类的对象
构造方法: Constructor类的对象
成员方法: Method类的对象
好处:
1. 可以在程序运行过程中, 操作这些对象
2. 可以解耦, 提高程序的可扩展性
Java代码在计算机中的3个阶段:
SOURCE: 源代码阶段
CLASS: 类对象阶段
RUNTIME: 运行时阶段
反射: 获取字节码对象的3种方式
1. Class.forName("全类名")
将字节码文件加载进内存,返回Class对象
适用场景: 多用于配置文件,将类名定义在配置文件中. 读取文件, 加载类
2. 类名.class .
通过类名的属性class获取
适用场景: 多用于参数的传递 getConstructor(String.class, int.class)
3. 对象.getClass()
getClass()方法在Object类中定义
适用场景: 多用于对象的获取字节码的方式 p.getClass()
同一个类的字节码对象, 只有"唯一的一个
反射: 获取成员变量Field
注解
注解: 概念
注解: JDK内置
JDK中预定义的一些注解:
@Override: 检测被该注解标注的方法是否是"重写"父类(接口)的
@Deprecated: 该注解标注的内容,表示已过时
@SuppressWarnings: 压制警告. 一般传递参数all @SuppressWarnings("all")
public interface 接口名 {}
自定义注解格式:关键字 @interface
元注解
public @interface 注解名称 {
属性; (接口中的抽象方法)
属性;
属性;
...
}
自定义注解: 属性
属性:接口中的"抽象方法"
属性的要求:
1. 属性的"返回值类型"可以是以下类型
基本数据类型(8种)
String
枚举
注解
以上类型的数组
2. 定义了属性,在使用注解时, 需要"给属性赋值" (其实是抽象方法的返回值)
1. 属性使用 default 关键字指定默认值, 则可以不赋值
2. 如果只有一个名为"value"的属性需要赋值, 则 value 可以省略, 直接写值
|
|