| 十三、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 
 引用对象的实例方法,其实就引用类中的成员方法 引用类的实例方法,其实就是引用类中的成员方法 引用构造器,其实就是引用构造方法 十四、函数式接口函数式接口概述常用函数式接口之Supplier常用函数式接口之Consumer常用函数式接口之Predicate常用函数式接口之FunctionStrem流l格式 类名::new范例 Student::new //Lambda简化写法
 useStudentBuilder((name,age) -> new Student(name,age));
 
 //引用构造器
 useStudentBuilder(Student::new);
 
 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模块的基本使用 十六、Junit测试在项目中创建两个模块。一个是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 
 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());
 }
 }
 
 
 
 
 |