JDK 8 新特性
1、Lambda 表达式
1.1 语法
(参数) -> {表达式},多个参数用逗号隔开,可以显示定义参数类型,也可以不定义参数类型,{}可以写也可以不写。
(parameters) -> expression 或 (parameters) ->{ statements; }
1.2 代码示例
public class Test {
public static void main(String[] args) {
TTest tTest = (i,j)-> System.out.println(i+j);
tTest.outPut(1,2);
}
interface TTest{
void outPut(int a, int b);
}
}
2、方法引用
通过方法名来指向这个方法,使用方法是 类名::方法名 ,方法应用主要分为以下四类:
2.1 构造器引用
Test test = Test::new;
2.2 静态方法引用
Test test = Test::staticMethod;
2.3 对象方法引用
String str = Test::getName();
2.4 实例方法引用
Test test = Test::new;
String str = test::getName();
3、函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
3.1 语法
定义一个函数式接口:
@FunctionalInterface
interface FunctionalInterfaceTest
{
void sayMessage(String message);
}
4、默认方法
默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法;
4.1 语法
在方法名前面加个 default 关键字即可
4.2 实例代码
public interface Test{
default void print(){
System.out.println("Test Method!");
}
}
5、Stream
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
5.1 生成流
有两种方式生成流:
1、stream():为集合创建串行流
2、parallelStream():为集合创建并行流
5.2 Stream常用方法
List<String> lists= Arrays.asList("abc", "", "bc", "ef", "cd","fu");
- forEach
迭代流中的每个数据
lists.forEach(s -> System.out.println(s))
- map
map 方法用于映射每个元素到对应的结果
List<String> mapList = lists.stream().map(i -> i + 1).collect(Collectors.toList());
- filter
设置的条件过滤出元素
List<String> list = lists.stream().filter(i -> !i.isEmpty()).collect(Collectors.toList());
- limit
获取指定数量的流
List<String> list = lists.stream().limit(2).collect(Collectors.toList());
- sorted
对流进行排序
List<Integer> numbers = Arrays.asList(3, 2, 1, 4, 7, 6, 5);
List<Integer> numberSorted = numbers.stream().sorted().collect(Collectors.toList());
- Collectors
将流转换成集合和聚合元素,Collectors 可用于返回列表或字符串
List<String> list = lists.stream().filter(i -> !i.isEmpty()).collect(Collectors.toList());
List<String> list = lists.stream().filter(i -> !i.isEmpty()).collect(Collectors..joining(", "));
- 统计
统计结果的收集器,主要用于int、double、long等基本类型
List<Integer> numbers = Arrays.asList(3, 2, 1, 4, 7, 6, 5);
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
int sum = stats.getSum();//计算所有数之和
int count = stats.getCount();//计算个数
int maxNum = stats.getMax();//计算最大数
int MinNum = stats.getMin();//计算最小数
int average = stats.getAverage();//计算平均数
5、Optional 类
Optional 类是一个可以为null的容器对象,使用Optional不用显式进行空值检测,可以很好的避免空指针异常
5.1 Optional常用方法
- empty()
返回空的 Optional 实例
Optional<Integer> optional = Optional.empty();
- filter
过滤Optional
Optional<String> stringOptional = optional1.filter(x -> x.contains("4"));
- flatMap
如果有值,则返回执行后面函数后的Optional类型放回值
Optional<String> optionalS = optional1.flatMap(v -> optional1.of(v));
- map
这个跟flatMap类似
Optional<Boolean> aBoolean = optional1.map(s -> s.equals("123"));
- get
获取值,如果有值,则返回该值,没有抛出异常:NoSuchElementException
System.out.println(optionalS.get());
- hashCode
返回存在值的哈希码
int hashCode = optionalS.hashCode();
- isPresent
如果值存在则返回true,否则false
boolean present = optional.isPresent();//false
boolean present1 = optional1.isPresent();//true
- of
返回一个指定非null值的Optional
Optional<Integer> optionalInteger = optional.of(1);
- ofNullable
允许传空值,传空则返回空,不传空则放回指定值的Optional
Optional<Object> optionalO = optional.ofNullable(null);
- orElseThrow
如果存值,返回包含的值,否则抛出传入的异常
Integer integer = optional.orElseThrow(NoSuchFieldError::new);
- orElse
存在则返回该值,不存在则返回2(传入的值)
Integer orElse = optional.orElse(2);
- orElseGet
和orElse类似,但是orElseGet比orElse性能要好,应为orElse不管Optional是否为空都会执行后面的函数,orElseGet则只有在Optional为空时执行
Integer integer1 = optional.orElseGet(() -> optional.get());
- toString
返回一个Optional的非空字符串,用来调试
String string = optional.toString();
System.out.println(string);
6、Base64
Java 8 内置了 Base64 编码的编码器和解码器,Base64工具类提供了一套静态方法获取下面三种BASE64编解码器:
- 基本:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/
- URL:输出映射到一组字符A-Za-z0-9+_,输出是URL和文件。
- MIME:输出隐射到MIME友好格式。输出每行不超过76字符,并且使用’\r’并跟随’\n’作为分割。编码输出最后没有行分割。
6.1 Base64内嵌类
1、Encoder:Base64 编码来编码字节数据(加密)
Decoder.getEncoder()//返回一个 Base64.Encoder,编码使用基本型 base64 编码方案
Decoder.getMimeEncoder()//编码使用 MIME 型 base64 编码方案。
Decoder.getUrlDecoder()//编码使用 URL 和文件名安全型 base64 编码方案。
2、Decoder:Base64 编码来解码字节数据(解密)
Decoder.getDecoder()//返回一个 Base64.Decoder,解码使用基本型 base64 编码方案
Decoder.getMimeDecoder()//解码使用 MIME 型 base64 编码方案。
Decoder.getUrlDecoder()//解码使用 URL 和文件名安全型 base64 编码方案。