java_新特性未整理

时间:2019-08-23
本文章向大家介绍java_新特性未整理,主要包括java_新特性未整理使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
package FunctionalFormula;

public interface Test {
/**
* 函数式接口:
* 概念:
* 有且仅有一个抽象方法的接口
* 接口中何以包含其他方法(默认,静态,私有)
*
* 格式:
* interface 接口名称{
* public abstract 返回值类型 方法名称(可选参数信息);
* 其他非抽象方法内容
*
* }
* 注解:
* @FunctionalInterface(检测接口是否是一个函数式接口)
* 是:编译成功
* 否:编译失败(接口中没有抽象方法或抽象方法个数大于1)
* 使用:
* public static void show(接口名){
* 接口名.方法
* }
*/
//声明一个函数接口


/** 调用show方法,方法的参数是一个接口,所以可以传递接口中的实现类对象
* 调用show方法,方法的参数是一个接口,所以可以传递接口的匿名内部类
* 调用show方法,方法的参数是一个函数式接口,所以可以传递Lambda表达式show((函数参数)->{实现体})
* 简化Lambda表达式:
* show((参数)->如果只有一句则可以不写大括号)
* 函数式编程:
* Lambda的延迟执行:
* 有些场景代码执行后,结果不一定会被使用,从而造成性能浪费。而Lambda表达式是延迟执行的,这正好可以作为解决方案,提升性能
* 使用Lambda优化日志案例
* Lambda的特点:延迟加载
* Lambda使用前提:必须存在函数式接口
* 使用Lambda表达式作为参数传递,仅仅是把参数传递到showLog方法中
* 只有满足条件:
* 才会调用MessageBuilder中的方法
* 才会进行拼接
* 条件满足:MessageBuilder中的方法不会执行
*
* 常用的函数式接口:
* java.util.function.Supplier<T>
* get() 获取一个泛型参数指定的类型的对象数据
* Supplier<T>接口被称之为生产型接口,指定接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据
* 求数组元素最大值
*
* java.util.Function.Consumer<T>:
* 消费型接口,泛型执行什么类型就可以使用accept方法消费什么类型的数据
* 默认方法:andThen
* 如果一个方法的参数和返回值全是Consumer类型,消费的时候首先一个操作,然后一个操作,实现组合
* 需要两个Consumer接口,可以把两个接口组合到一起,在数据进行消费
* con1.andThen(con2).accept(s);谁在前谁先消费
*
* java.util.function.Predicate<T>接口
* 作用:某周数据类型的数据进行判断返回boolean
* 接口中包含的抽象方法:
* boolean test(T t)对用来指定数据类型数据进行判断的方法
* 接口中默认方法:
* and():表示并且关系,也可以用于连接两个判断条件
* or():表示或者关系,也可以用于连接两个判断条件
* negate():取反
*
* java.util.function.Function<T,R>
* 接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件
* 抽象方法:
* R apply(T t):根据类型T的参数获取类型R
* 的结果。
* 默认方法:
* andThen:用力组合操作
*
* Stream流:JDK1.8之后出现的
* java.util.stream.Stream<T>
* list.stream()
* .filter(Lambda表达式)
* .filter(Lambda表达式)
* .forEach(Lambda迭代)
* 获取流:
* 所有的Collection集合都可以通过stream默认方法获取流
* default Stream<E> stream()
* stream接口的静态方法of可以获取数组对应的流
* static<T> Stream<T> of(T...value)
* 参数是一个可变参数,可以传递数组
* 常用方法:
* 消费:forEach
* 接受Consumer接口函数,会将每个流元素交给函数进行处理
* Consumer接口时一个消费型的函数式接口,可以传递Lambda表达式消费数据
* 用来遍历流中的数据,是一个终结方法,遍历之后不能继续调用Stream流中的其他方法
* 过滤:filter
* filter(Predicate)
* Predicate时一个函数式接口,所以可以传递Lambda表达式,对数据进行过滤
* Predicate中的抽象方法:
* boolean test(T t)
* 特点:
* Stream流属于管道流,只能被消费(使用)一次
* 第一个Stream流调用完毕方法,数据就会流转到下一个Stream
* 而这时第一个Stream流已经使用完毕就会关闭
* 所以第一个Stream流就不能在调用方法
* 映射:map
* map(Function)
* R apply(T t)T转为R类型
* 统计个数:count
* long count()
* 取用前几个:limit
* limit(long maxSize)
* 参数时一个long类型,如果哟几个当长度大于参数进行截取,否则不进行操作
* limit方法是一个延迟方法,只是对流中的元素进行截取,返回的是一个新的流,所以可以继续调用Stream流中的其他方法
* 跳过前几个:skip
* skip(long n)
* 如果流当前长度大于n跳过n,如果小于n得到0的空流
* 组合:concat
* static concat()
* Stream.concat(第一个,第二个)
*方法引用:
*
*
*
*
*/
/*
Junit单元测试:
测试分类:
1.黑盒测试:不需要写代码,给输入值,看程序是否能输出期望的值
2.白盒测试:需要写代码,关注程序具体执行流程
Junit测试使用:白盒测试
步骤:
1.定义一个测试类(测试用例)
2.定义测试方法:可以独立运行
建议:
方法名test测试的方法名
返回值:void
参数列表:空参
3.给方法加@Test注解
4.导入Junit
断言 :我断言这个结果是3
Assert.assertEquals(期望,返回的结果)

初始化方法:
用于资源申请,所有测试方法在执行前都会执行该方法
@Before
public void init(){

}

释放资源方法:
在所有测试方法执行完后会自动执行此方法
@After
public void close(){
}

反射:框架设计的灵魂
框架:半成品软件,可以在框架的基础上进行软件开发,简化编码
概念:将累的各个组成部分封装为其他对象,就是放射机制
好处:
1.可以在程序运行过程中操作这些对象
2.可以解耦,提高程序的可扩展性
获取class
Source源代码阶段:Class.forName(全类名):将字节码文件加载进内存,返回class对象
Class类对象阶段:类名.class:类名的属性.class获取
Runtime运行时阶段:对象.getClass():Object中定义的
class对象功能:
获取功能:
1.获取成员变量们
getFields():获取所有public修饰的成员变量
getField(String name):获取指定名称的public修饰的成员变量

d.settAccessible(暴力反射)
getDeclaredFields()
getDeclaredField(String name)

2.获取构造方法们
getConstructors()
getConstructor(<?>... parameterTypes)
newInstance

getDeclaredConstructor(<?>... parameterTypes)
getDeclaredConstructors()

3.获取成员方法们
getMethods()
getMethod(String name,<?>... parameterTypes)
invoke

getDeclaredMethods()
getDeclaredMethod(String name, <>... parameterTypes)

4.获取类名
getName()

案例:
需求:写框架不改变代码创建任意类对象,并且执行其中任意方法
实现:
1.配置文件
2.反射
步骤:
1.将需要创建的对象的全类名喝需要执行的方法定义在配置文件中
Properties
2.在程序中加载读取配置文件
3.使用反射技术来加载类文件进内存
4.创建对象
5.执行方法

注解:
概念:
注释:用文字描述程序,给程序员看
注解:JDK1.5后的新特性
JDK预定义注解:
override:检测被该注解标注的方法是否是继承父类(接口)
Deprecated:将该注解标注的内容已过时
SuppressWarnings:压制警告

自定义注解:
格式:
元注解
public @interface 注解名称{}
本质:
注解本质上就是一个接口,该接口默认继承了Annotation接口
public interface 注解名 extends java.lang.annotation.Annotation{}
属性:接口中的抽象方法
要求:
1.属性的返回值类型:
基本数据类型
String
枚举
注解
以上类型的数组
2.定义了属性,在使用时需要给属性赋值:
1.如果定义属性时使用default给属性默认初始化值则使用注解时可以不进行属性的赋值
2.如果只有一个属性需要赋值,并且属性的名称是value,则value可以省略,直接定义值即可
元注解:描述注解的注解
@Target:描述注解能够作用的位置
value = {ElementType.TYPE}表示在下边的注解只能作用在类上
value = {ElementType.METHOD}表示作用于方法上
value = {ElementType.FIELD}表示作用成员变量上

@Retention:描述注解被保留的阶段
@Documented:描述注解是否被抽取到api文档中
@Inherited:描述注解是否被子类继承


在程序中使用(解析)注解:
1.获取该类的字节码文件对象
2.过去上边的注解对象:获取到的字节码对象.getAnnotation(注解名.class)
3.调用注解对象中定义的抽象方法,获取返回值:2得到的.className

method.isAnnotationPresent:判断是否有指定的注解,注解.class
method.invoke:执行
*/
}

原文地址:https://www.cnblogs.com/aikang525/p/11400006.html