十三、Lambda表达式格式: (形式参数) -> {代码块}
形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可 ->:由英文中画线和大于符号组成,固定写法。代表指向动作 代码块:是我们具体要做的事情,也就是以前我们写的方法体内容
组成Lambda表达式的三要素: 省略的规则 Lambda表达式和匿名内部类的区别
public interface Addable {
int add(int x, int y);
}
public interface Flyable {
void fly(String s);
}
public class LambdaDemo {
public static void main(String[] args) {
// useAddable((int x,int y) -> {
// return x + y;
// });
//参数的类型可以省略
useAddable((x, y) -> {
return x + y;
});
// useFlyable((String s) -> {
// System.out.println(s);
// });
//如果参数有且仅有一个,那么小括号可以省略
// useFlyable(s -> {
// System.out.println(s);
// });
//如果代码块的语句只有一条,可以省略大括号和分号
useFlyable(s -> System.out.println(s));
//如果代码块的语句只有一条,可以省略大括号和分号,如果有return,return也要省略掉
useAddable((x, y) -> x + y);
}
private static void useFlyable(Flyable f) {
f.fly("风和日丽,晴空万里");
}
private static void useAddable(Addable a) {
int sum = a.add(10, 20);
System.out.println(sum);
}
}接口组成新增默认,静态,私有方法常量 public static final 抽象方法 public abstract 默认方法(Java 8) default --public default void show3() { }不是抽象方法,所以不强制被重写,但是可以被重写 静态方法(Java 8) static --private static void method() {}只能通过接口名调用,不能通过实现类名或者对象名调用 私有方法(Java 9) private --private void show() { }
方法引用方法引用符 :: 该符号为引用运算符,而它所在的表达式被称为方法引用 引用类方法,其实就是引用类的静态方法 格式 类名::静态方法 范例 Integer::parseInt
引用对象的实例方法,其实就引用类中的成员方法 引用类的实例方法,其实就是引用类中的成员方法 引用构造器,其实就是引用构造方法 l格式 类名::new 范例 Student::new
//Lambda简化写法
useStudentBuilder((name,age) -> new Student(name,age));
//引用构造器
useStudentBuilder(Student::new);
十四、函数式接口函数式接口概述常用函数式接口之Supplier常用函数式接口之Consumer常用函数式接口之Predicate常用函数式接口之FunctionStrem流Stream流把真正的函数式编程风格引入到Java中 Stream应用于集合、数组。 生成Stream流的方式 Collection体系集合 使用默认方法stream()生成流, default Stream<E> stream() list.stream() set.stream() 数组生成流:Stream.of() Map体系集合 把Map转成Set集合,间接的生成流 数组 通过Stream接口的静态方法of(T... values)生成流
Stream流中间操作方法 Stream流终结操作方法 Stream流的收集操作概念 对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中。 常用方法 [td]方法名 | 说明 | R collect(Collector collector) | 把结果收集到集合中 |
listStream.collect(Collectors.toList())将流存到list集合中 setStream.collect(Collectors.toSet());将流存到Set集合中 mapStream.collect(Collectors.toMap(key,value))将流存到Map集合中 工具类Collectors提供了具体的收集方式 [td]方法名 | 说明 | public static <T> Collector toList() | 把元素收集到List集合中 | public static <T> Collector toSet() | 把元素收集到Set集合中 | public static Collector toMap(Function keyMapper,Function valueMapper) | 把元素收集到Map集合中 |
十五、类加载、反射、模块化类加载java虚拟机类加载的过程和时机
类加载
类链接
验证:验证当前类的语法结构 准备: 类变量的内存分配 解析: 将变量名换成内存地址
类初始化
何时会触发类的加载和初始化
类加载器的作用
Java类加载器分类(父类委托)
应用程序类加载器:负责加载我们工程中自定义的类 平台类加载器:底层类库的加载 根类加载器:底层类库的加载
反射作用:反射被称为框架技术的灵魂; 反射的概念
获取类class对象的三种方式
反射获取构造方法
获取共有构造方法: c.getConstructors() 获取全部构造方法: c.getDeclaredConstructors() 获取单个的共有构造方法: c.getConstructor(Class<?>... parameterTypes) 获取单个全部的构造方法:c.getDeclaredConstructor(Class<?>... parameterTypes) 获取到构造方法对应的对象后如何实例化:newInstance() 可以调用私有构造:setAccessible(true);
反射获取字段
获取所有公有属性:getFields() 获取所有属性:getDeclaredFields() 获取单个公有属性:getField(String fieldName) 获取单个所有属性:getDeclaredField(String fieldName) 为属性赋值:变量名.set(obj,"西安"); 读取属性的值:get(obj)
反射调用方法
获取所有公有方法包括继承来的:getMethods() 获取所有方法不包括继承来的:getDeclaredMethods() 获取单个公有方法:getMethod("方法名") 获取单个方法:getDeclaredMethod("方法名") 方法调用:m.invoke(obj);
模块化模块化编程
import com.test.MyInterface;
import com.test.MyInterfaceImpl1;
import com.test.MyInterfaceImpl2;
module MyOne {
exports com.test;
provides MyInterface with MyInterfaceImpl1, MyInterfaceImpl2;
}
import com.test.MyInterface;
module MyTow {
requires MyOne;
uses MyInterface;
}
使模块a中的类可以创建模块b中类的对象并使用, 在被调用的模块内创建module-info.java file://H:\%E5%B0%B1%E4%B8%9A%E7%8F%AD1\%E5%B0%B1%E4%B8%9A%E7%8F%ADse\day15-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E5%99%A8&%E5%8F%8D%E5%B0%84&%E6%A8%A1%E5%9D%97%E5%8C%96\%E7%AC%94%E8%AE%B0\img\05.png?lastModify=1558231862 在要调用的模块创建module-info.java,并写入以下内容 file://H:\%E5%B0%B1%E4%B8%9A%E7%8F%AD1\%E5%B0%B1%E4%B8%9A%E7%8F%ADse\day15-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E5%99%A8&%E5%8F%8D%E5%B0%84&%E6%A8%A1%E5%9D%97%E5%8C%96\%E7%AC%94%E8%AE%B0\img\06.png?lastModify=1558231862 模块的基本使用在项目中创建两个模块。一个是myOne,一个是myTwo 在myOne模块中创建以下包和以下类,并在类中添加方法 file://H:\%E5%B0%B1%E4%B8%9A%E7%8F%AD1\%E5%B0%B1%E4%B8%9A%E7%8F%ADse\day15-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E5%99%A8&%E5%8F%8D%E5%B0%84&%E6%A8%A1%E5%9D%97%E5%8C%96\%E7%AC%94%E8%AE%B0\img\01.png?lastModify=1558231862 file://H:\%E5%B0%B1%E4%B8%9A%E7%8F%AD1\%E5%B0%B1%E4%B8%9A%E7%8F%ADse\day15-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E5%99%A8&%E5%8F%8D%E5%B0%84&%E6%A8%A1%E5%9D%97%E5%8C%96\%E7%AC%94%E8%AE%B0\img\02.png?lastModify=1558231862 在myTwo模块中创建以下包和以下类,并在类中创建对象并使用 file://H:\%E5%B0%B1%E4%B8%9A%E7%8F%AD1\%E5%B0%B1%E4%B8%9A%E7%8F%ADse\day15-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E5%99%A8&%E5%8F%8D%E5%B0%84&%E6%A8%A1%E5%9D%97%E5%8C%96\%E7%AC%94%E8%AE%B0\img\03.png?lastModify=1558231862 file://H:\%E5%B0%B1%E4%B8%9A%E7%8F%AD1\%E5%B0%B1%E4%B8%9A%E7%8F%ADse\day15-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E5%99%A8&%E5%8F%8D%E5%B0%84&%E6%A8%A1%E5%9D%97%E5%8C%96\%E7%AC%94%E8%AE%B0\img\04.png?lastModify=1558231862 在myOne模块中src目录下,创建module-info.java,并写入以下内容 file://H:\%E5%B0%B1%E4%B8%9A%E7%8F%AD1\%E5%B0%B1%E4%B8%9A%E7%8F%ADse\day15-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E5%99%A8&%E5%8F%8D%E5%B0%84&%E6%A8%A1%E5%9D%97%E5%8C%96\%E7%AC%94%E8%AE%B0\img\05.png?lastModify=1558231862 在myTwo模块中src目录下,创建module-info.java,并写入以下内容 file://H:\%E5%B0%B1%E4%B8%9A%E7%8F%AD1\%E5%B0%B1%E4%B8%9A%E7%8F%ADse\day15-%E7%B1%BB%E5%8A%A0%E8%BD%BD%E5%99%A8&%E5%8F%8D%E5%B0%84&%E6%A8%A1%E5%9D%97%E5%8C%96\%E7%AC%94%E8%AE%B0\img\06.png?lastModify=1558231862
十六、Junit测试1.测试分类 2.Junit基本使用
public class Calculator {
/**
* 加法
* @param a
* @param b
* @return
*/
public int add (int a , int b){
//int i = 3/0;
return a - b;
}
/**
* 减法
* @param a
* @param b
* @return
*/
public int sub (int a , int b){
return a - b;
}
}public class CalculatorTest {
/**
* 初始化方法:
* 用于资源申请,所有测试方法在执行之前都会先执行该方法
*/
@Before
public void init(){
System.out.println("init...");
}
/**
* 释放资源方法:
* 在所有测试方法执行完后,都会自动执行该方法
*/
@After
public void close(){
System.out.println("close...");
}
/**
* 测试add方法
*/
@Test
public void testAdd(){
//1.创建计算器对象
System.out.println("testAdd...");
Calculator c = new Calculator();
//2.调用add方法
int result = c.add(1, 2);
//3.断言 我断言这个结果是3
Assert.assertEquals(3,result);
}
@Test
public void testSub(){
//1.创建计算器对象
Calculator c = new Calculator();
int result = c.sub(1, 2);
System.out.println("testSub....");
Assert.assertEquals(-1,result);
}
}3.单元测试需要使用的注解 @Before 执行功能方法之前被执行 @Test 执行功能方法 @After 执行功能方法之后被执行
十七、注解注解概念注解就是用于说明程序的。参与程序的运行 JDK1.5版本之后的新特性
注解的作用常用的注解自定义注解
public @interface 注解名称{
}本质
注解中的属性
属性(方法)的返回值数据类型
基本数据类型四类八种 String 枚举 注解 以上数据类型的数组
注意事项
元注解
解析注解
public class Dog {
public void eat() {
System.out.println("狗吃肉");
}
}
public class Cat {
public void eat() {
System.out.println("猫吃鱼");
}
}@Target(value = {ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
@Retention(value = RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface AnimalAnnotation {
String className(); // 记录 全类名
String methodName(); // 记录 方法名
}
@AnimalAnnotation(className = "com.itheima01.Cat",methodName = "eat")
public class Test06 {
public static void main(String[] args) throws Exception{
//获取注解中的属性值
//1.获取Test06类的Class对象
Class<Test06> cls = Test06.class;
//2.通过Class对象来获取注解对象
AnimalAnnotation animal = cls.getAnnotation(AnimalAnnotation.class);
//3.通过注解对象调用属性。来获取属性值
String className = animal.className();
String methodName = animal.methodName();
//通过反射来调用方法
//1.获取Class对象
Class cls2 = Class.forName(className);
//2.获取方法
Method method = cls2.getMethod(methodName);
//3.执行方法
method.invoke(cls2.newInstance());
}
}
|