函数式接口、Stream流、方法引用、Junit、反射、注解
2021-10-14 14:36:12 25 举报
AI智能生成
函数式接口、Stream流、方法引用、Junit、反射、注解
作者其他创作
大纲/内容
函数式编程
接口仅包含一个无参的方法: T get() 用来获取一个泛型参数指定类型的对象数据由于这是一个函数式接口,这也就意味着对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据
import java.util.function.Supplier;public class Demo08Supplier {private static String getString(Supplier<String> function) {return function.get();}public static void main(String[] args) {String msgA = \"Hello\";String msgB = \"World\";System.out.println(getString(() ‐> msgA + msgB));}}
Supplier接口
接口则正好与Supplier接口相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型决定。
抽象方法:void accept(T t)消费一个指定泛型的数据
默认方法:andThen如果一个方法的参数和返回值全都是Consumer 类型,那么就可以实现效果:消费数据的时候,首先做一个操作,然后再做一个操作,实现组合
Consumer接口
对某种类型的数据进行判断,从而得到一个boolean值结果
抽象方法:boolean test(T t)
默认方法:and
默认方法:or
默认方法:negate
Predicate接口
用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件。
抽象方法:R apply(T t)例如:将String 类型转换为Integer 类型
默认方法:andThen
Function接口
常用函数式接口都在java.util.function包下
函数式接口
Stream(流)是一个来自数据源的元素队列 1、元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。 2、数据源 流的来源。 可以是集合,数组 等。和以前的Collection操作不同, Stream操作还有两个基础的特征: 3、Pipelining: 中间操作都会返回流对象本身。(直到使用了终结方法如forEach、count) 这样多个操作可以串联成一个管道, 如同流式风格(fluentstyle)(链式编程)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。 font color=\"#4caf50\
当需要对多个元素进行操作(特别是多步操作)的时候,考虑到性能及便利性,我们应该首先拼好一个“模型”步骤方案,然后再按照方案去执行它。
流式思想
所有的Collection 集合都可以通过stream 默认方法获取流;
根据Collection获取流
java.util.Map 接口不是Collection 的子接口,且其K-V数据结构不符合流元素的单一特征,所以获取对应的流需要分key、value或entry等情况:都转换成Set集合
map.keySet().stream()获取Map集合中所有的键,存储到Set集合中,再通过stream()获取流
map.values().stream()获取Map集合中所有的值,存储到Set集合中
map.entrySet().stream()获取Map集合中所有的键值对对象,存储到Set集合中
根据Map获取流
Stream.of()
根据数组获取流
获取流
该方法是一个终结方法,接收一个Consumer 接口函数,会将每一个流元素交给该函数进行处理
逐一处理:forEach
该接口接收一个Predicate 函数式接口参数(可以是一个Lambda或方法引用)作为筛选条件。
过滤:filter
该接口需要一个Function 函数式接口参数,可以将当前流中的T类型数据转换为另一种R类型的流
映射:map
该方法是一个终结方法,返回一个long值代表元素个数(不再像旧集合那样是int值)
统计个数:count
参数是一个long型,如果集合当前长度大于参数则进行截取;否则不进行操作
取用前几个:limit
跳过前几个:skip
合并两个相同泛型的流
组合:concat
常用方法
Stream流
Subtopic
方法引用
不需要写代码,给输入值,看程序是否能够输出期望的值
黑盒测试
需要写代码的。关注程序具体的执行流程
白盒测试
测试分类
1. 定义一个测试类(测试用例) * 建议: * 测试类名:被测试的类名Test CalculatorTest * 包名:xxx.xxx.xx.test cn.itcast.test
2. 定义测试方法:可以独立运行 * 建议: * 方法名:test测试的方法名 testAdd() * 返回值:void * 参数列表:空参
3. 给方法加@Test
4. 导入junit依赖环境
@Before:修饰的方法会在测试方法之前被自动执行
@After:修饰的方法会在测试方法执行之后自动被执行
Junit使用:白盒测试
Junit(单元测试)
* 框架:半成品软件。可以在框架的基础上进行软件开发,简化编码* 反射:将类的各个组成部分封装为其他对象,这就是反射机制 * 好处: 1. 可以在程序运行过程中,操作这些对象。 2. 可以解耦,提高程序的可扩展性。
概念
Java代码在计算机经历的三阶段
Class.forName(\"全类名\"):将字节码文件加载进内存,返回Class对象(全类名含包名) 多用于配置文件,将类名定义在配置文件中。读取文件,加载类
类名.class:通过类名的属性class获取 多用于参数的传递
对象.getClass():getClass()方法在Object类中定义着 多用于对象的获取字节码的方式
1、获取Class对象
Field[] getFields() :获取所有public修饰的成员变量
Field getField(String name) 获取指定名称的 public修饰的成员变量
Field[] getDeclaredFields() 获取所有的成员变量,不考虑修饰符
Field getDeclaredField(String name) 获取指定名称的成员变量,不考虑修饰符
获取成员变量
获取值 get(Object obj)
忽略访问权限修饰符的安全检查setAccessible(true):暴力反射
获取成员变量Field后进行操作
Constructor<?>[] getConstructors()Field[] getFields() :获取所有public修饰的成员变量
Constructor<T> getConstructor(类<?>... parameterTypes) 获取指定名称的 public修饰的构造方法
Constructor<T> getDeclaredConstructor(类<?>... parameterTypes) 获取所有的构造方法,不考虑修饰符
Constructor<?>[] getDeclaredConstructors() 获取指定名称的构造方法,不考虑修饰符
获取构造方法
T newInstance(Object... initargs)
如果使用空参数构造方法创建对象,操作可以简化:Class对象的newInstance方法
获取构造方法Constructor后创建对象
Method[] getMethods() 获取所有public修饰的成员方法
Method[] getDeclaredMethods() 获取所有成员方法
获取成员方法
获取方法名称 String getName:获取方法名
获取成员方法Method对象 ,执行方法本身
String getName()
获取全类名
2、Class对象功能
反射:框架设计的灵魂
注解
Central Topic
0 条评论
回复 删除
下一页