Java8新特性

1、Lambda表达式

2、函数式接口

3、接口的默认方法与静态方法

4、方法引用

5、Optional

一、Java 8 Lambda表达式

Lambda表达式,也称为闭包,它是推动Java 8发布的最重要新特性。

Lambda允许把函数作为一个方法的参数(函数作为参数传递进方法)。

1.1 语法

使用表达式可以使代码变得更加简洁。

(parameters) -> expression 或者 (premeters) -> {statements}

可选类型声明: 不需要声明参数类型,编译器可以统一识别参数值。

可选的参数圆括号: 一个参数无需定义圆括号,但多个参数需要定义圆括号。

可选的大括号: 如果主体包含了一个语句,就不需要使用大括号

可选的返回关键字: 如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回一个数值。

1.2 Lambda表达式实例

public class LambdaTest {

    interface IMath{
int operation(int a, int b);
} interface IPrint{
void printMessage(String message);
} private int operate(int a , int b, IMath math){
return math.operation(a, b);
} //类型声明
IMath add = (int a, int b) -> a + b; //不用类型声明
IMath sub = (a,b) -> a -b; //大括号中返回语句
IMath multi = (int a, int b) -> {
return a * b;
}; IMath div = (int a, int b) -> a/b; void testLambda(LambdaTest lambdaTest){
System.out.println(" 2 + 1 = " + lambdaTest.operate(2,1, add));
System.out.println(" 2 - 1 = " + lambdaTest.operate(2,1, sub));
System.out.println(" 2 * 1 = " + lambdaTest.operate(2,1, multi));
System.out.println(" 2 / 1 = " + lambdaTest.operate(2,1, div)); //不用括号
IPrint iPrint1 = message ->
System.out.println("Hi " + message);
iPrint1.printMessage("Nick"); //使用括号
IPrint iPrint2 = (message) ->
System.out.println("Hi " + message);
iPrint2.printMessage("Tome");
} public static void main(String[] args) {
LambdaTest test = new LambdaTest();
test.testLambda(test); } }

  

  打印结果:

Lambda的原理可参考:  Java 8 Lambda表达式实现原理解析

二、函数式接口

用@FunctionalInterface修饰的接口叫做函数式接口,

函数式接口就是一个只具有一个抽象方法的普通接口, @FunctionalInterface可以起到校验的作用。

比较常用的接口

Supplier: 无参数,返回一个结果

Function:接受一个输入参数,返回一个结果

Consumer: 接受一个输入参数,无返回结果

Predicate: 接受一个输入参数,返回一个布尔值结果。

三、接口的默认方法与静态方法

我们在Java8之前,如果我们需要在为一个增加一个方法,那么它的所有实现类都要实现这个方法

如:动物接口

public interface AnimalInterface {
void getName(); }

 有两个实现类,分别为 

public class Cat implements AnimalInterface{
public void getName() {
System.out.println("I'am cat");
}
}

  和

public class Dog implements AnimalInterface {
public void getName() {
System.out.println("I'm dog");
}
}

  如果要在AnimalInterface中增加方法,如 int getAge(); 那么在Dog和Cat类都要实现这个方法。

解决方法:

增加一个抽象类,实现了AnimalInterface接口

public abstract class AbstractAnimal  implements  AnimalInterface{

    public int getAge() {
return 0;
}
}

 Cat类和Dog类分别继承抽象类AbstractAnimal

public class Cat extends AbstractAnimal{
public void getName() {
System.out.println("I'am cat");
}
}  

此时,在AnimialInterface中增加了方法

public interface AnimalInterface {
void getName();
int getAge();
}

  这时候,主需要修改抽象AbstractAnimal  就可以了。AbstractAnimal  增加getAge方法,Dog类和Cat类就不需要动。

那么在Java8中已经实现了直接在接口中添加方法,一种是Default 方法(默认方法),一种Static方法(静态方法)

1、接口中的默认方法

在接口中用default修饰的方法称为默认方法

public interface AnimalInterface {
void getName();
default int getAge(){
return 0;
};
}

  接口中的默认方法一定要有默认实现(方法体),接口实现者可以继承它,也可以覆盖它。

2、静态方法

因为有了默认方法和静态方法,就不用修改它的实现了,可以进行直接调用。

四、方法引用

有个函数式接口Consumer,

@FunctionalInterface
public interface Consumer<T> { void accept(T t); default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}

里面有个方法accept能够接受一个参数但是没有返回值。要实现accept方法,让它能打印接收到那个参数,可以使用Lambda表达式  

        Consumer<String> consumer = s -> System.out.println(s);
consumer.accept("Hi, Nick");

 如果想要实现PrintStream类,那就更简单一点

        Consumer<String> consumer2 = System.out::println;
consumer2.accept("Hi, Nick2");  

 这就是方法引用,方法引用的参数列表必须与函数式接口的抽象方法的参数类别保持一致,返回值不作要求。

五、Optional

空指针异常时导致Java应用程序失败的最常见原因之一,为了接口空指针异常,Google在Guava项目中引入Optional类,Java 8 中也引入了Optional。

Optional实际上是个容器: 它可以保存类型T的值,或者仅仅保存null。Optional提供了很多方法,这样就不需要显示进行空值检测。

创建Optional对象的几个方法:

1、Optional.of(T value),返回一个Optional对象,value不能为空,否则会出空指针异常

2、Optional.ofNullable(T value), 返回一个Optiona对象,value可以为空

3、Optional.empty() 代表空

其它API:

1、optional.isPresent(), 是否存在值(不为空)

2、optional.ifPresent(Consumer<? super T> consumer), 如果存在值则执行consumer

3、optional.get(),获取value

4、optional.orElse(T other), 如果没有值则返回other

5、optional.orElseGet(Suppliser<? extends T> other),如果没有值则执行other并返回

6、optional.orElseThrow(Supplier<? extentds X> exceptionSupplier), 如果没值则执行execeptionSupplier,并抛出异常

Java 8 新特性总结的更多相关文章

  1. Java 8新特性-4 方法引用

    对于引用来说我们一般都是用在对象,而对象引用的特点是:不同的引用对象可以操作同一块内容! Java 8的方法引用定义了四种格式: 引用静态方法     ClassName :: staticMetho ...

  2. Spring 4支持的Java 8新特性一览

    有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览S ...

  3. java 8 新特性

    最近在IDEA的️驱使下,看了点java8的东西,链接贴一下,,,,, 1.Java 8新特性概述2.Java 8中的 Stream API 详解[3.Java 8新特性终极指南] 简单的使用看完新特 ...

  4. Java 8 新特性终极版

    声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自己 ...

  5. Java 8新特性前瞻

    快端午小长假了,要上线的项目差不多完结了,终于有时间可以坐下来写篇博客了. 这是篇对我看到的java 8新特性的一些总结,也是自己学习过程的总结. 几乎可以说java 8是目前为止,自2004年jav ...

  6. Java 8新特性探究(八)精简的JRE详解

    http://www.importnew.com/14926.html     首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 ...

  7. Java 8 新特性1-函数式接口

    Java 8 新特性1-函数式接口 (原) Lambda表达式基本结构: (param1,param2,param3) -> {代码块} 例1: package com.demo.jdk8; i ...

  8. 【整理】Java 8新特性总结

    闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...

  9. 一小时上手Java 8新特性

    一小时上手Java 8新特性 本文摘译自 https://www.journaldev.com/2389/java-8-features-with-examples,并做了适当增补. Iterable ...

  10. Java 8 新特性:1-函数式接口

    (原) Java 8 新特性1-函数式接口 Lambda表达式基本结构: (param1,param2,param3) -> {代码块} Lambda表达式结构: (type1 arg1,typ ...

随机推荐

  1. tomcat运行一段时间出“org.apache.coyote.http11.Http11Processor.service Error parsing HTTP request header”

    试了好多种方法,貌似还是没有解决问题,不过也学到了点东西,记录下备忘吧. 异常详情: 1.首先看到最多的就是说在server.xml中的Connector中添加maxHttpHeaderSize=&q ...

  2. golang读写文件的几种方式

    golang中处理文件有很多种方式,下面我们来看看. (1)使用os模块 先来看看如何查看文件属性 package main import ( "fmt" "os&quo ...

  3. IAR为STM32创建工程模板(基于STM32f103zet6)

    今天给小伙伴分享一篇给stm32新建工程模版 1.首先打开IAR,就是这个样子 2.再建一个目录文件夹 3.建立一个工作空间,以及建好工作空间如右图所示 4.接下来建立工程,Project------ ...

  4. HTML&CSS基础-字体的样式

    HTML&CSS基础-字体的样式 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.HTML源代码 <!DOCTYPE html> <html> & ...

  5. 用js刷剑指offer(数组中的逆序对)

    题目描述 题目描述 在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数P.并将P对1000000007取模的结果输出. 即输出P ...

  6. 网站检测空链、死链工具(Xenu)

    网站常用检测空链.死链工具,Xenu是很小但是功能强大的检查网站404链接的软件,支持多线程,无需安装可直接打开使用.步骤如下: 网站的链接一般都成千上万,如果存在大量的空链接将大大的影响用户体验,怎 ...

  7. Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling

    Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapt ...

  8. ted演讲小总结(持续更新_12月15日)

    目录 2019年12月1日 星期日 2019年12月2日 星期一 2019年12月3日 星期二 2019年12月8日 星期日 2019年12月15日 星期日(这个演讲相对来说不好理解,因为这类逻辑暂时 ...

  9. LG2664 树上游戏

    树上游戏 题目描述 lrb有一棵树,树的每个节点有个颜色.给一个长度为n的颜色序列,定义s(i,j) 为i 到j 的颜色数量.以及 $$sum_i=\sum_{j=1}^ns(i,j)$$ 现在他想让 ...

  10. C++异常处理(一)----基本语法

    实验环境 win7 下的vs2017,基本原则:throw抛出的数据类型,和cathc语句的数据类型要一致 异常的引发和异常的处理可以分布在不同函数中,所以c++的异常是跨栈的 异常是由“地地道道“的 ...