第四十二天 Java基础学习(三十六)

一、Lambda

●方法引用

   Lambda体可能仅调用一个已存在方法,而不做任何其它事,对于这种情况,通过一个方法名字来引用这个已存在的方法会更加清晰。方法引用是一个更加紧凑,易读的Lambda 表达式,注意方法引用是一个Lambda 表达式,方法引用操作符是双冒号“:”

•方法引用的方式:

       对象引用::实例方法名

       类名:静态方法名

       类名:实例方法名

       类名::new (也称为构造方法引用)

       类型:::new (也称为数组引用)

●函数式接口

函数式接口:只能有一个抽象方法,其他的可以有default、static、Object里public方法等。作用:在Java中主要用在Lambda表达式和方法引用(实际上也可认为是Lambda表达式)上。

JDK8专门提供了@Functionallnterface注解,用来进行编译检查。

注意:Comparable并没有被标记为函数式接口

●内置的函数式接口

JDK 也提供了大量的内置函数式接口,使得 Lambda 表达式的运用更加方便、高效。这些内置的函数式接口已经可以解决开发过程中绝大部分的问题,只有一小部分比较特殊得情况需要我们自己去定义函数式接口。在这里特别介绍四个函数式接口。

1.Consumer:消费型接口(void accept(Tt))。有参数,无返回值

2.Supplier:供给型接口(Tget())。只有返回值,没有入参

3.Function:函数型接口(Rapply (Tt))。一个输入参数,一个输出参数,两种类型不可不同、可以一致讨论

4.Predicate:断言型接口(boolean test(Tt))。输入一个参数,输出一个boolean类型得返回值

 

●流式编程

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                继续执行到下一个断点或者程序结束

 

 

 

你可能感兴趣的:(学习)