一、Lambda
●方法引用
Lambda体可能仅调用一个已存在方法,而不做任何其它事,对于这种情况,通过一个方法名字来引用这个已存在的方法会更加清晰。方法引用是一个更加紧凑,易读的Lambda 表达式,注意方法引用是一个Lambda 表达式,方法引用操作符是双冒号“:”
•方法引用的方式:
对象引用::实例方法名
类名:静态方法名
类名:实例方法名
类名::new (也称为构造方法引用)
类型:::new (也称为数组引用)
●函数式接口
函数式接口:只能有一个抽象方法,其他的可以有default、static、Object里public方法等。作用:在Java中主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。
JDK8专门提供了@Functionallnterface注解,用来进行编译检查。
注意:Comparable并没有被标记为函数式接口
●内置的函数式接口
JDK 也提供了大量的内置函数式接口,使得 Lambda 表达式的运用更加方便、高效。这些内置的函数式接口已经可以解决开发过程中绝大部分的问题,只有一小部分比较特殊得情况需要我们自己去定义函数式接口。在这里特别介绍四个函数式接口。
1.Consumer
2.Supplier
3.Function
4.Predicate
●流式编程
Stream作为Java8的一大亮点,它与java.io包里的InputStream和OutputStream是完全不同的概念。它是对容器对象功能的增强,它专注于对容器对象进行各种非常便利、高效的聚合操作或者大批量数据操作。
StreamAPI借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。同时,它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。所以说,Java8中首次出现的java.util.stream是一个函数式语言+多核时代综合影响的产物。
• 流式编程:并行流
简单来说,并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。Java 8中将并行进行了优化,可以很容易的对数据进行并行操作。Stream API可以声明性地通过parallel()与sequential()在并行流与串行流之间进行切换。
●Stream有如下三个操作步骤:
1、创建 Stream:从一个数据源,如集合、数组中获取流。
2、中间操作:一个操作的中间链,对数据源的数据进行操作。
3、终止操作:一个终止操作,执行中间操作链,并产生结果。
当数据源中的数据上了流水线后,这个过程对数据进行的所有操作都称为“中间操作”。中间操作仍然会返回一个流对象,因此多个中间操作可以串连起来形成一个流水线。比如map (mapTolnt, flatMap等)、filter、 distinet、sorted、 peek、 lmit、 skip、 parallel、sequential、unordered。
当所有的中间操作完成后,若要将数据从流水线上拿下来,则需要执行终止操作。终止操作将返回一个执行结果,这就是想要的数据。比如:forEach、forEachOrdered、toArray、reduce、collect、min、max、count、anyMatch、allMatch、noneMatch、findFirst、findAny、iterator。
多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何处理!而在终止操作时一次性全部处理,称作“惰性求值”。
● Optional
Optional存在的意义就是简化为了防止空指针而进行的if..else等判断的代码。
提供了全局value属性存储值。
●获取Optional对象
1.通过Optional.of()方法,传递的参数的值为null,会出现空指针异常
2.通过Optional.ofNullable()方法,创建Optional对象
●Optional使用
•参数为null, 使用创建参数类型的对象
①如果传递参数值为null,可以使用orElse(T)或orElseGet(Supplier)进行参数的实例化。
②如果传递参数值不为null,orElse()也会执行,orElseGet()不会执行
•获取Optional中存储的值
可以通过get()获取到全局value对应的值
• 判断传递的参数是否为null
①为null,不会执行Consumer的实现
②不为null,执行Consumer的实现
●自定义异常
在程序中,可能会遇到JDK提供的任何标准异常类都无法充分描述清楚想要表达的问题,这种情况下可以创建自己的异常类,即自定义异常类。
•自定义异常类只需从Exception类或者它的子类派生一个子类即可。
•自定义异常类如果继承Exception类,则为CheckedException异常,必须对其进行处理;如果不想处理,可以让自定义异常类继承运行时异常RuntimeException类。
•习惯上,自定义异常类应该包含2个构造器:一个是默认的构造器,另一个是带有详细信息的构造器。
●IDEA 调试 debug
调试的核心是断点。程序执行到断点时,暂时挂起,停止执行。
●断点breakpoint
•设置断点:
①在行号后面单击即可增加断点
②在断点上再单击即可取消断点
●进入调试视图
通过如下方式都可以进入调试视图:
•单击工具栏上的按钮:
•右键单击编辑区,点击:debug
•单步调试:遇到函数进入 step into 若当前执行的是一个自定义方法,则会进入方法内部。JDK内置方法不会进去。
•强制进入 force step into 可以跳进任何方法,包含JDK内置方法
•跳出函数 step out 当单步执行到子方法内时,用step out就可以执行完子方法余下部分,并返回到上一层方法
•删除栈帧 drop frame 删除当前栈帧。跳回到上一个栈帧
•执行的光标处 run to cursor 一直执行,到光标处停止,用在循环内部时,点击一次就执行一个循环
•重新执行程序 rerun 重新执行所有程序
•继续执行 resume 继续执行到下一个断点或者程序结束