虽然JDK8已经出来了N久,其新特性也在日益改变着我们的编码习惯和风格。虽然有些新特性用起来很顺手,但是总是傻傻分不清到底是哪个版本的。趁今天有时间,我们就来总结一下,JDK8有哪些能提升我们开发效率的新特性:

一、静态方法的默认方法和静态方法

众所周知,在接口中定义的普通方法都是抽象方法,方法前面默认都会添加 public abstract ,不能有方法实现,需要在接口的实现类中对方法进行具体实现。

接口:

package com.beck.util;

/**
* @author 我是七月呀
* @date 2020/12/18
*/
public interface MethodService {
/**
* 抽象方法
*/
void abstractMethod(); /**
* 默认方法
*/
default void defaultMethod(){
System.out.println("执行了默认方法");
} /**
* 静态方法
*/
static void staticMethod(){
System.out.println("执行了静态方法");
} }

实现类:

package com.beck.util;

/**
* @author 我是七月呀
* @date 2020/12/18
*/
public class MethodServiceImpl implements MethodService { @Override
public void abstractMethod() {
System.out.println("执行了抽象方法");
} }

测试类:

package com.beck.util;

/**
* @author 我是七月呀
* @date 2020/12/18
*/
public class TestMethod { public static void main(String[] args) {
MethodServiceImpl methodService = new MethodServiceImpl();
methodService.abstractMethod();
methodService.defaultMethod();
//调用静态方法
MethodService.staticMethod();
MethodService methodServiceOne = new MethodService() {
@Override
public void abstractMethod() {
} @Override
public void defaultMethod() {
System.out.println("默认方法是可以被重写的");
}
};
methodServiceOne.defaultMethod();
}
}
 public class Student {
private int id;      
private String name;     
private String sex;     
public int getId() {         return id;     }       public void setId(int id) {         this.id = id;     }       public String getName() {         return name;     }       public void setName(String name) {         this.name = name;     }       public String getSex() {         return sex;     }       public void setSex(String sex) {         this.sex = sex;     }       public Student() {     }       public Student(int id, String name, String sex) {         this.id = id;         this.name = name;         this.sex = sex;     }       @Override     public String toString() {         return "Student{" +             "id=" + id +             ", name='" + name + '\'' +             ", sex='" + sex + '\'' +             '}';     } }

总结:1、抽象方法必须重写,默认方法可选择性重写,静态方法无法重写

​ 2、抽象方法和默认方法都不可以通过接口调用,必须通过接口的实现类实例的对象来调用;静态方法可以直接通过接口调用,不可以通过接口的实现类实例的对象来调用

二、Lambda表达式

Lambda表达式是Java8中非常重要的一个新特性,其基于函数式编程的思想,支持将代码作为方法参数进行使 用。可以把Lambda表达式理解为通过一种更加简洁的方式表示可传递的匿名函数。

它本身没有名称,而且不像方法那样属于某一个类,但是可以有参数列表、代码体、返回值。使用了Lambda表达 式之后就不需要再去编写匿名类了

Lambda使用规范

Lambda基础格式

(参数列表) ‐> {
方法体     
}

参数列表:即匿名方法的形参

-> :Lambda运算符

方法体:用于执行业务逻辑。可以是单一语句,也可以是语句块。如果是单一语句,可以省略花括号。当需要返回 值,如果方法体中只有一条语句,可以省略return,会自动根据结果进行返回。

1、数的Lambda表达式;
()->System.out.println("haha");
2、只有一个参数的Lambda表达式;
x->{
System.out.println("haha");
return x;
}
3、有多个参数的Lambda表达式;
(x,y)->{
System.out.println(x);
System.out.println(y);
return x+y;
}
ps:参数列表中参数的数据类型可以交给JVM根据上下文进行推断。所以可以 不用定义类型。
4、多个参数一条语句的Lambda表达式
(x,y) -> x+y;

Lambda使用对比

package com.beck.util.student;
import java.util.ArrayList;
/**
* @author 我是七月呀
* @date 2020/12/18
*/
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
list.add("zhaoliu");
//for循环遍历
for (String s : list) {
System.out.println(s);
}
//lambda表达式遍历
list.forEach(s -> System.out.println(s)); //匿名内部类
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("I'm running");
}
};
//lambda表达式
Runnable runnable1 = () -> System.out.println("I'm running");
}
}

三、函数式接口

在Java8中为了让现在有的函数能够更加友好的使用Lambda表达式,因此引入了函数式接口这个概念。其是一个 仅有一个抽象方法的普通接口。如果声明多个抽象方法则会报错。但是默认方法和静态方法在此接口中可以定义多 个。 要想自定义一个函数式接口的话,需要在接口上添加 @FunctionalInterface 。

/**
* @author 我是七月呀
* @date 2020/12/21
*/
@FunctionalInterface
public interface DemoService { void method();
}
/**
* @author 我是七月呀
* @date 2020/12/21
*/
public class Demo {
public static void demo(DemoService demoService){
demoService.method();
} public static void main(String[] args) {
demo(()-> System.out.println("hahahah"));
} }

四、常见应用

在Java8的类库设计中,已经引入了几个函数式接口:Predicate、Consumer、Function、Supplier

1、Predicate使用

Predicate接口是Java8定义的一个函数式接口,属于java.util.function包下,用于进行判断操作,内部定义一个 抽象方法test、三个默认方法and,negate,or、一个静态方法isEqual

import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate; /**
* @author 我是七月呀
* @date 2020/12/21
*/
public class MyPredicateDemo {
public static List<Student> filter(List<Student> studentList, Predicate<Student> predicate) {
ArrayList<Student> list = new ArrayList<>();
studentList.forEach(student -> {
if (predicate.test(student)) {
list.add(student);
}
});
return list;
} public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student(1, "张三", "M"));
students.add(new Student(2, "李四", "M"));
students.add(new Student(3, "王五", "F"));
List<Student> result = filter(students, student -> student.getSex().equals("F"));
System.out.println(result.toString());
}
}

2、Consumer使用

Consumer也是JDK8提供的函数式接口,用于进行获取数据的操作,其内部定义了一个抽象方法accept、一个默 认方法andThen。

import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
/**
* @author 我是七月呀
* @date 2020/12/21
*/
public class MyConsumerDemo {
public static void foreach(List<String> arrays, Consumer<String> consumer){
arrays.forEach(s -> consumer.accept(s));
}
public static void main(String[] args) {
List<String> arrays = new ArrayList<>();
arrays.add("java");
arrays.add("python");
arrays.add("go");
arrays.add("hive");
foreach(arrays,s -> System.out.print(s+" "));
}
}

3、Function的使用

Function主要用于进行类型转换的操作。内部提供一个抽象方法apply、两个默认方法compose,andThen、一个 静态方法identity。对于apply方法,它接收一个泛型T对象,并返回一个泛型R的对象。

import java.util.function.Function;
/**
* @author 我是七月呀
* @date 2020/12/21
*/
public class MyFunctionDemo {
public static Integer convert(String value, Function<String,Integer> function){
return function.apply(value);
}
public static void main(String[] args) {
String value = "22";
Integer result = convert(value, s -> Integer.parseInt(s) + 22);
System.out.println(result);
}
}

4、Supplier 的使用

Supplier也是用来进行值获取操作,内部只有一个抽象方法get

import java.util.function.Supplier;
/**
* @author 我是七月呀
* @date 2020/12/21
*/
public class MySupplierDemo {
public static Integer getMin(Supplier<Integer> supplier){ return supplier.get();
}
public static void main(String[] args) {
// 创建数组
int[] arr = {100,20,50};
Integer result = getMin(() -> {
int min = arr[0];
for (int i : arr) {
if (i < min) {
min = i;
}
}
return min;
}); System.out.println(result);
}
}

五、方法引用

方法引用更近一步的优化了Lambda的使用。它让代码感觉更加的自然。我们可以直接使用 :: 来简化Lambda表 达式的使用。其使用语法如下:

类名或实例名::方法名
import java.util.ArrayList;
import java.util.Comparator; /**
* @author 我是七月呀
* @date 2020/12/21
*/
public class MyDemo {
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
Student student1 = new Student(2,"张三","M");
Student student2 = new Student(1,"李四","F");
students.add(student1);
students.add(student2);
students.sort(Comparator.comparing(Student::getId));
System.out.println(students);
}
}

JDK8新特性详解(一)的更多相关文章

  1. JDK8新特性详解(二)

    Stream流的使用 流操作是Java8提供一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要改进了对集合类的 API和新增Stream操作.Stream类中每一个方法都对应集合上的一 ...

  2. jdk8新特性(详解)

    最近在复习外加看点面试题,jdk8的新特性虽然在项目用用到过一两个,准备系统的了解一下jdk8的常用新特性 一:Lambd表达式 也可称为闭包         引入函数式编程到Java中 为了使现有函 ...

  3. Java9 新特性 详解

    作者:木九天   <   Java9 新特性 详解  > Java9 新特性 详解 摘要: 1.目录结构 2.repl工具 jShell命令 3.模块化 4.多版本兼容jar包 5.接口方 ...

  4. Java基础学习总结(33)——Java8 十大新特性详解

    Java8 十大新特性详解 本教程将Java8的新特新逐一列出,并将使用简单的代码示例来指导你如何使用默认接口方法,lambda表达式,方法引用以及多重Annotation,之后你将会学到最新的API ...

  5. ES6,ES2105核心功能一览,js新特性详解

    ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...

  6. 《Android群英传》读书笔记 (5) 第十一章 搭建云端服务器 + 第十二章 Android 5.X新特性详解 + 第十三章 Android实例提高

    第十一章 搭建云端服务器 该章主要介绍了移动后端服务的概念以及Bmob的使用,比较简单,所以略过不总结. 第十三章 Android实例提高 该章主要介绍了拼图游戏和2048的小项目实例,主要是代码,所 ...

  7. Android群英传笔记——第十二章:Android5.X 新特性详解,Material Design UI的新体验

    Android群英传笔记--第十二章:Android5.X 新特性详解,Material Design UI的新体验 第十一章为什么不写,因为我很早之前就已经写过了,有需要的可以去看 Android高 ...

  8. 点击--》java9 新特性 详解

    引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为 ...

  9. java10 新特性 详解

    引言: 点击-->java9 新特性 详解 点击-->java8 新特性 详解 正题: 1.局部变量var 将前端思想var关键字引入java后段,自动检测所属于类型,一种情况除外,不能为 ...

随机推荐

  1. 接入twitter第三方登陆接口遇到的一个问题

    本地开了 Shadowsocks,然后postman模拟的twitter的接口是请求成功的,然后用php-curl去请求网址,出现以下错误 Failed to connect to api.twitt ...

  2. Java中的第三大特性-多态性

    一.多态性的概念 多态性是以继承为基础上的,举个例子,人属于动物,狗也属于动物,所以动物就是父类,而人和狗都是动物的子类,都属于动物. 二.多态的使用 (1)多态一般用于方法参数或者方法返回值,特别当 ...

  3. Java基础教程——多线程:创建线程

    多线程 进程 每一个应用程序在运行时,都会产生至少一个进程(process). 进程是操作系统进行"资源分配和调度"的独立单位. Windows系统的"任务管理器&quo ...

  4. mysql 数据文件

    mysql8.0取消了frm文件 . ibd数据和索引

  5. 在VMware下创建windows server 2008虚拟机

    1.创建新的虚拟机 打开VMware软件,点击主页内创建新的虚拟机 2.进入新建虚拟机向导 点击典型,点击下一步 3.在下一步中单击稍后安装操作系统 点击下一步 4.选择操作系统类型 客户机操作系统选 ...

  6. java顺序、选择、循环结构

    一.顺序结构 二.选择结构 1.if都执行 2.if else if else 条件满足才执行 3.选择结构switch 一个case后有多条语句要加花括号 多个case的值不能相同 case中要加b ...

  7. JZOJ2020年9月5日提高组反思

    JZOJ2020年9月5日提高组反思 T1 考试的时候没有头绪,就打了个暴力,愉快的拿到了10分的\(impossible\) 正解是\(DP\),设\(f[i][j][k]\)表示地\(i\)种币值 ...

  8. 《技术男征服美女HR》—Fiber、Coroutine和多线程那些事

    1.起点 我叫小白,坐在这间属于华夏国超一流互联网公司企鹅巴巴的小会议室里,等着技术面试官的到来. 令我感到不舒服的,是坐在我对面的那位HR美女一个劲儿的盯着我打量!虽说本人帅气,但是也不能这么毫无顾 ...

  9. .Net Core JWT 动态设置接口与权限

    通过上一篇.Net Core官方的 JWT 授权验证学习到了JWT的授权.可以发现一个问题,就是如果每个接口可以使用的角色都是写死的,这样如果有所修改会非常麻烦,虽然用policy可以一定程度上缓解, ...

  10. moviepy音视频开发:音频合成类CompositeAudioClip介绍

    ☞ ░ 前往老猿Python博文目录 ░ CompositeAudioClip是AudioClip的直接子类,用于将几个音频剪辑合成为一个音频剪辑.CompositeAudioClip类只有一个构造方 ...