虽然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. 详讲FL Studio通道设置菜单

    我们在FL Studio"通道设置按钮"上右击鼠标就会弹出一个设置菜单,它包含了通道操作的各种常用命令.下文小编将会为大家详细讲解这些命令的具体作用,一起来学习吧! 1.首先,我们 ...

  2. Word2 word输入公式+文字转表格

    1.word中输入 =rand() -点击回车键-会随机生成一段文字-可用作排版练习/虚拟的文字排版设计 ##也可以为=rand(2,3)等,括号里可以随即填写其他数字,最后生成文字字数等不一样 2. ...

  3. idea 安装教程

    臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭臭是猪臭 ...

  4. [Docker]Docker与Linux ip_forward数据包转发

    背景 今天在一台新虚拟机上需要临时启动一个consul服务,安装Docker后使用docker启动,但是在执行启动命令后发现docker有一个警告: WARNING: IPv4 forwarding ...

  5. copy/b一个隐藏文件的小技巧

    首先找一张图片 再放一个我们想隐藏的东西 压缩一下 新建txt文本文件b.txt,输入这段代码 copy/b namei.jpg + a.rar namei2.jpg 保存,将文件名改为b.bat 双 ...

  6. [Android systrace系列] 抓取开机过程systrace

    ------------------------------------------------------------------------- 这篇文章的小目标:了解抓取开机过程systrace的 ...

  7. 第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法

    第7.18节 案例详解:Python类中装饰器@staticmethod定义的静态方法 上节介绍了Python中类的静态方法,本节将结合案例详细说明相关内容. 一.    案例说明 本节定义了类Sta ...

  8. 第8.26节 重写Python类中的__getattribute__方法实现实例属性访问捕获

    一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...

  9. 第15.23节 PyQt(Python+Qt)入门学习:Model/View架构中QListView视图配套Model的开发使用

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.概述 QListView理论上可以和所有QAbstractItemModel派生的类如QStri ...

  10. 【题解】「UVA11626」Convex Hull

    凸包模板题. 之前写过拿 Graham 算法求凸包的,为了不重复/多学点知识,那这次拿 Andrew 算法求凸包吧qaq *此文章所有图片均为作者手画. Andrew 算法 假设我们有这些点: 首先把 ...