黑马程序员技术交流社区
标题: 【石家庄校区】学习总结3 [打印本页]
作者: 水煮鱼000 时间: 2019-5-19 10:11
标题: 【石家庄校区】学习总结3
十三、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());
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |