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

一、Lambda

●方法引用

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

•方法引用的方式:

       对象引用::实例方法名

       类名:静态方法名

       类名:实例方法名

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

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

●函数式接口

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

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

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

●内置的函数式接口

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

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

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

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

4.Predicate<T>:断言型接口(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                继续执行到下一个断点或者程序结束

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值