JDK 8 新特性-详细解释

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");
  1. forEach
    迭代流中的每个数据
lists.forEach(s -> System.out.println(s))
  1. map
    map 方法用于映射每个元素到对应的结果
List<String> mapList = lists.stream().map(i -> i + 1).collect(Collectors.toList());
  1. filter
    设置的条件过滤出元素
List<String> list = lists.stream().filter(i -> !i.isEmpty()).collect(Collectors.toList());
  1. limit
    获取指定数量的流
List<String> list = lists.stream().limit(2).collect(Collectors.toList());
  1. sorted
    对流进行排序
List<Integer> numbers = Arrays.asList(3, 2, 1, 4, 7, 6, 5);
List<Integer> numberSorted = numbers.stream().sorted().collect(Collectors.toList());
  1. 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(", "));
  1. 统计
    统计结果的收集器,主要用于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编解码器:

  1. 基本:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/
  2. URL:输出映射到一组字符A-Za-z0-9+_,输出是URL和文件。
  3. 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 编码方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值