Java8-7-接口中默认方法和静态方法
接口中的默认方法 Java 8 中允许接口中包含具有具体实现的方法,该方法称为 “默认方法” ,默认方法使用 default 关键字修饰。
1234567interface MyFunc<T> { T func(int a); default String getName() { return "Hello, Java8"; } }
接口默认方法的 ”类优先” 原则
若一个接口中定义了一个默认方法,而另外一个父类或接口中又定义了一个同名的方法时
选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具有相同名称和参数的默认方法会被忽略。
接口冲突。如果一个父接口提供一个默认方法,而另一个接口也提供了一个具有相同名称和参数列表的方法(不管方法是否是默认方法),那么必须覆盖该方法来解决冲突
接口中的静态方法 Java 8 中,接口中允许添加静态方法。
12345678910interface MyFunc<T> { T fu ...
Java8-6-并行流
并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流
基本数据类型优化之前用到的很多Stream的方法由于都使用了泛型。所以涉及到的参数和返回值都是引用数据类型。即使我们操作的是整数小数,但是实际用的都是他们的包装类。所以为对大数据量时装箱拆箱的时间消耗进行优化。Stream还提供了很多专门针对基本数据类型的方法
12345mapToIntmapToLongmapToDoubleflatMapToIntflatMapToDouble
并行流 使用parallel方法将串行流转换成并行流,也可以通过parallelStream直接获取并行流对象
12345678910Stream<Integer> stream = Stream.of(1,2,3,4,5,6,7,8,9,10);Integer sum = stream.parallel() .peek(new Consumer<Integer>() { public void accept(Integer num) { Syst ...
Java8-5-Optional
Optional 类 (java.util.Optional) 是一个容器类,代表一个值存在或不存在, 原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。并且可以避免空指针异常。
常用方法
方法
说明
Optional.of(T t)
创建一个 Optional 实例
Optional.empty()
创建一个空的 Optional 实例
Optional.ofNullable(T t)
若 t 不为 null,创建 Optional 实例,否则创建空实例
isPresent()
判断是否包含值
orElse(T t)
如果调用对象包含值,返回该值,否则返回 t
orElseGet(Supplier s)
如果调用对象包含值,返回该值,否则返回 s 获取的值
map(Function f)
如果有值对其处理,并返回处理后的Optional,否则返回 Optional.empty()
flatMap(Function mapper)
与 map 类似,要求返回值必须是Optional
使用创建对象Op ...
Java8-4-Stream API
Stream API 提供了一种高效且易于使用的处理数据的方式, Java 8 的 Stream 使用函数式编程模式,可以用来对集合或数组进行链状流式的操作
概述
Stream
Stream 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。
Stream 自己 不会存储元素。
Stream 不会改变源对象。相反,他们会返回一个持有结果的新 Stream
Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行
操作创建操作一个数据源(如:集合、数组),获取一个流
获取流
方法
说明
default Stream stream()
返回一个顺序流
default Stream parallelStream()
返回一个并行流
数组创建流
Java8 中的 Arrays 的静态方法 stream() 可以获取数组流
方法
说明
static<T> Stream<T> stream(T[] array)
返回一个流
数组:Arrays.stream(数 ...
Java8-3-方法引用与构造器引用
方法引用使用 lambda 表达式时,如果方法中 只有一个方法的调用 话(包括构造方法),可以使用方法引用进一步简化代码, 使用操作符 :: 将 方法名和对象或类的名字分隔 开来。
主要使用情况:
对象::实例方法
类::静态方法
类::实例方法
引用对象的实例方法
基本语法
1对象名::方法名
使用前提
如果在重写方法时,方法体中 只有一行代码,并且该代码是 调用某对象的成员方法,并且要把重写的 抽象方法中所有的参数按照顺序传入该成员方法中,使用引用对象的实例方法
1234567891011// 使用lambda表达式StringBuilder sb = new StringBuilder();authors.stream() .map(author->author.getName()) .forEach(name->sb.append(name));// 使用方法引用StringBuilder sb = new StringBuilder();authors.stream() .map(author-&g ...
Java8-2-函数式接口
概述 仅含有一个抽象方法 的接口称之为函数式接口,JDK中的函数式接口都加上 @FunctionalInterface 注解标识
Java 内置四大核心函数式接口
函数式接口
参数类型
返回类型
用途
Consumer 消费型接口
T
void
对类型为 T 的对象应用操作,包含方法: void accept(T t)
Supplier 供给型接口
无
T
返回类型为 T 的对象,包含方法:T get()
Function 函数型接口
T
R
对类型为 T 的对象应用操作,并返回结果。结果是 R 类型的对象。包含方法:R apply(T t)
Predicate 断定型接口
T
boolean
确定类型为 T 的对象是否满足某约束,并返回 boolean 值。包含方法 boolean test(T t)
Consumer 消费接口
根据其中抽象方法的参数列表和返回值类型,在方法中传入参数进行消费
123456@FunctionalInterfacepublic interface Consumer<T> { vo ...