Java基础第二十九天总结——Java8新特性

目录:

一、Lambda表达式

二、函数式(Functional)接口

三、方法引用于构造器引用

四、强大的Stream API

五、Optional类

/*--------------------------分割线---------------------------*/

一、Lambda表达式

速度更快

代码更少(增加了新的语法:Lambda 表达式)

强大的 Stream API

便于并行

最大化减少空指针异常:Optional

Nashorn引擎,允许在JVM上运行JS应用

Lamdba是一个匿名函数,使用它可以写出更简洁,更灵活的代码。可以理解为一种更简洁的书写方式。

Lamdba操作符:

左侧:指定了Lamdba表达式需要的参数列表

右侧:指定了Lamdba体,是抽象方法的实现逻辑,也即Lamdba表达式要执行的功能。

Landba表达式的类型依赖于上下文环境,由编译器推断出来的,也就是所谓的“类型推断”。

二、函数式(Function)接口

只包含一个抽象方法的接口,称为函数式接口。

若Lamdba表达式抛出一个受检异常(即非运行时异常),可以在接口上使用@FunctionaIInterface注解,判断它是否是一个函数式接口。同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。

如何理解函数式接口:

为了迎合更广泛的技术要求,Java不但可以支持OOP,也可以支持OOF。在Java8中,Lambda表达式是对象,而不是函数,他们必须依附于一类特别的对象类型——函数式接口。Lambda表达式就是一个函数式接口的实例。

所以前面用匿名实现类表示的现在都可以用Lambda表达式来写。

 三、方法引用与构造器引用

方法引用就是Lambda表达式,也就是函数式接口的一个实例。

要求:实现接口的抽象方法的参数列表和返回值类型,必须与方法引用的方法的参数列表和返回值类型保持一致!

如下三种主要使用情况:

对象::实例方法名

类::静态方法名

类::实例方法名

注意:当函数式接口方法的第一个参数是需要引用方法的调用者,并且第二个参数是需要引用方法的参数(或无参数)时:ClassName::methodName

构造器引用

格式: ClassName::new

与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法,要求构造器参数列表要与接口中抽象方法的参数列表一致!且方法的返回值即为构造器对应类的对象。

数组引用

格式: type[] :: new

四、强大的Stream API

Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一个则是 Stream API。

Strem是什么?

“集合讲的是数据,Stream讲的是计算!”

注意:

①Stream 自己不会存储元素。

②Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。

③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

Stream 的操作三个步骤

1- 创建 Stream

一个数据源(如:集合、数组),获取一个流

2- 中间操作

一个中间操作链,对数据源的数据进行处理

3- 终止操作(终端操作)

一旦执行终止操作,就执行中间操作链,并产生结果。之后,不会再被使用

创建 Stream方式一:通过集合

Java8 中的 Collection 接口被扩展,提供了两个获取流的方法:

default Stream<E> stream() : 返回一个顺序流

default Stream<E> parallelStream() : 返回一个并行流

创建 Stream方式二:通过数组

Java8 中的 Arrays 的静态方法 stream() 可以获取数组流:

static <T> Stream<T> stream(T[] array): 返回一个流重载形式,能够处理对应基本类型的数组:

public static IntStream stream(int[] array)

public static LongStream stream(long[] array)

public static DoubleStream stream(double[] array)

创建 Stream方式三:通过Stream的of()

可以调用Stream类静态方法 of(), 通过显示值创建一个流。它可以接收任意数量的参数。

public static<T> Stream<T> of(T... values) : 返回一个流

创建 Stream方式四:创建无限流

可以使用静态方法 Stream.iterate() 和 Stream.generate(),创建无限流。

迭代

public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)

生成

public static<T> Stream<T> generate(Supplier<T> s)

Stream 的中间操作

1-筛选与切片

多个中间操作可以连接起来形成一个流水线,除非流水线上触发终止操作,否则中间操作不会执行任何的处理!而在终止操作时一次性全部处理,称为“惰性求值”。

Stream 的终止操作

1-匹配与查找

终端操作会从流的流水线生成结果。其结果可以是任何不是流的值,例

如:List、Integer,甚至是 void 。

流进行了终止操作后,不能再次使用。

备注:map 和 reduce 的连接通常称为 map-reduce 模式,因 Google用它来进行网络搜索而出名。

 

Collector 接口中方法的实现决定了如何对流执行收集的操作(如收集到 List、Set、Map)。另外, Collectors 实用类提供了很多静态方法,可以方便地创建常见收集器实例.

具体方法与实例如下表:

 五、Optional类

Optional提供很多有用的方法,这样我们就不用显式进行空值检测。创建Optional类对象的方法:

Optional.of(T t) : 创建一个 Optional 实例,t必须非空;

Optional.empty() : 创建一个空的 Optional 实例

Optional.ofNullable(T t):t可以为null

 判断Optional容器中是否包含对象:

boolean isPresent() : 判断是否包含对象

void ifPresent(Consumer<? super T> consumer) :如果有值,就执行Consumer接口的实现代码,并且该值会作为参数传给它。

 获取Optional容器的对象:

T get(): 如果调用对象包含值,返回该值,否则抛异常

T orElse(T other) :如果有值则将其返回,否则返回指定的other对象。

T orElseGet(Supplier<? extends T> other) :如果有值则将其返回,否则返回由Supplier接口实现提供的对象。

T orElseThrow(Supplier<? extends X> exceptionSupplier) :如果有值则将其返回,否则抛出由Supplier接口实现提供的异常。

原文地址:https://www.cnblogs.com/zhoutie170821/p/12109899.html

时间: 2024-10-17 16:56:24

Java基础第二十九天总结——Java8新特性的相关文章

Java基础--第二十五天

TCP协议: Socket类 构造方法: TCP程序,必须先开服务器端 成员方法 服务器端程序: 创建服务器端Socket对象: 监听连接: 获取输入流,并显示: 释放资源 ServerSocket类 网络编程 网络编程+反馈 大融合[所有的Java基础融合为一个实例] 正则表达式: 符合某种规则的字符串,常用于校验 规则: Pattern类 A:字符 x:任意字符表示任意字符本身 \\:反斜线字符[转义字符] \r:回车 \n:换行 B:字符类 [abc]:表示a,b,c任意字符一次 [^ab

java 基础加强(myeclipse,debug,junit,JDK5新特性,反射)

思维导图 1.myeclipse的安装和使用 *eclipse:是一个免费的开发工具 *myeclipse:是一个收费的插件,破解myeclipse, **安装目录的要求: 不能有中文和空格 **安装完成之后,选择一个工作空间 ,这个工作空间不能有中文和空格 *破解myeclipse **运行run.bat文件,但是运行之前,必须要安装jdk,通过配置环境变量 *myeclipse的使用 *创建一个工程 -类型 javaproject  web  project -选择依赖的jdk,可以使用my

Java基础:JDK1.5后的新特性:自动拆装箱,以及注意事项

首先来看一段代码: 1 Integer x = new Integer(4); 2 Integer y = 4; 在JDK1.5版本后,以上两行代码都能编译通过,那是因为JDK1.5后加入新特性,自动装箱. 第一句代码是正常的创建对象方法,创建了一个Integer包装类对象. 而第二句中,当左边的Interger类型变量指向右边的int基本类型数据时,右边的基本数据类型会自动装箱成Integer对象,即隐式执行了new Integer(4). 再来一段代码: 1 Integer x = new

Java基础--第二十六天

正则表达式的规则字符: A:字符 x 字符 x,任意字符代表自己本身. \\ 反斜线字符 \r      回车 \n     换行 B:字符类 [abc] a.b 或 c,任意字符一次. [^abc] 任何字符,除了 a.b 或 c [a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内 [0-9] 任意的数字字符一次 C:预定义字符类 . 任意的字符 \d 数字:[0-9] \w 单词字符:[a-zA-Z_0-9] 单词字符:英文,数字,及_ D:边界匹配器 ^ 行的开头 $ 行的结

大数据Java基础第十九天作业

第一题:简单的URL获取资源下载 import java.net.URL; import java.net.URLConnection; import java.io.InputStream; import java.io.FileOutputStream; class DownloadDemo{     public static void main(String[] args){         String src_url = "http://one.jiangmin.com/jiangm

夯实Java基础(二十三)——Java8新特征之Optional类

一.简介 Optional类是Java8为了解决null值判断问题,借鉴google guava类库的Optional类而引入的一个同名Optional类,使用Optional类可以避免显式的null值判断(null的防御性检查),避免null导致的NPE(NullPointerException). 我们来看一段代码: public static String getGender(Student student) { if(null == student) { return "Unkown&q

Java基础第二十四天总结——集合

目录: 一.Map接口 二.Collection工具类 /*---------------分割线---------------------*/ 一.Map接口 Map中的key用Set来存放,不可重复.作为一个Map对象所对应的类,需重写hashCode和equals方法. HashMap是Map接口使用频率最高的实现类. 添加.删除.修改操作: Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中 void putAl

Java基础--第十九天

异常分类: Exception       RuntimeException 非运行时期异常     运行时期异常 自定义异常 IO流: Java中的io流是用来处理不同设备间的输入输出问题的 io流操作的类都在io包中: io流分类: 流向分: 输入流   读取数据 输出流     写入数据 按操作数据不同: 字节流 字符流 File类: 构造方法 常见方法: 创建: createNewFile():当文件不存在时,创建文件 当没有给出指定路径时,以当前项目路径为文件创建路径. 相对路径和绝对

java基础第十九天_QQ、多线程下载

1.QQ 2.屏广软件,大数据包处理,frame缓冲区最多保持两帧画面,1s内没有集齐所有frameunit,则丢弃. 3.从互联网多线程下载 地址 : http://apache.opencas.org/hadoop/common/hadoop-2.7.2/hadoop-2.7.2.tar.gz RandomAccessFile Thread (>= 3) HttpURLConnection.setRequestProperty("Range", "bytes=209