Java 8 新特性指南(java的八大特性)
mhr18 2025-07-02 22:58 4 浏览 0 评论
本教程可以在实验楼(shiyanlou.com)中在线练习。
一、实验简介
Java 8是近年来最后起来的一个Java编程语言发行版本。Oracle 在 2014 年 3 月发布了它。该版本为Java带来了许多新特性,是一个具有重大改变的版本。
本课程适用于Java初学者或者是具有一定编程经验的开发者,学完本课程的感觉就像为自己的技能“打了个补丁”。因此在学习之前,仍然建议你具有Java编程基础。
本节内容主要为你讲解Lambda表达式和方法引用两个知识点。
1.1 知识点
Lambda表达式的含义及使用方法
方法引用
1.2 准备工作
常言道:工欲善其事,必先利其器。为了能够正常地利用Java 8带来的特性,我们需要使用JRE 8.0版本(JDK 8.0)作为我们的编译运行环境。实验楼中的Eclipse默认使用JavaSE 1.7,在本实验中我们需要将其修改为JavaSE 1.8。
1.2.1 创建项目
首先请双击桌面上的Eclipse图标,打开Eclipse。然后在菜单中点击File
->New
->Other
。
在弹出的对话框中选择Java Project
,然后点击Next
进入下一步。
在新建项目对话框中填入项目名HelloJava8
,并在下方的JRE设置中选择JavaSE-1.8
。再点击Next
进入下一步。
接着点击Finish
按钮完成项目的创建。
若弹出下面这样的对话框,点击Yes
即可启用相关特性。
1.2.2 项目属性设置
在项目创建完成后,你可能会看到有报错。这是因为当前编译环境并没有加载Java 8相关的库。下面我们来手动设置一下,顺便可以学习如何更改项目所依赖的库。
首先右键点击左侧的项目,然后点击Properities
进入属性设置。
在弹出的属性对话框中,选中左侧的Java Build Path
页,然后在右侧窗口中选择Libraries
选项卡,选中下面报错的库,然后点击Edit
按钮。
在弹出的Edit Library对话框中点击Installed JREs
按钮。
接着选择Standard VM
,点击Next
按钮进入下一步。
在Add JRE对话框中,点击Directory
按钮添加JRE的目录。
现在你需要选中
这个目录。
/usr/lib/jvm/java-8-oracle
随着目录设置的完成,相关的选项已经被加载进来了。点击Finish
按钮完成配置。
回到项目属性对话框,将项目的的JRE设置更改为下面新添加的java-8版本。
返回到上一级的设置,查看Execution environment
是否为JavaSE-1.8。如果是,则点击Finish
关闭对话框。
再点击OK
按钮完成设置。
1.2.3 创建包和类
在项目的scr
目录上点击右键,选择New
->Package
。
在弹出的对话框中填入包名com.shiyanlou.java8
,完成包的创建。
接着在项目目录中的这个包上点击右键,选择New
->Class
。
在弹出的对话框中,填入类名NewFeaturesTester
,完成类的创建。
至此,准备工作就完成了。
二、Lambda表达式
Lambda 表达式是在Java 8中引入的,并且成为了Java 8最大的特点。它使得功能性编程变得非常便利,极大地简化了开发工作。
2.1 语法
一个Lambda表达式具有下面这样的语法特征。它由三个部分组成:第一部分为一个括号内用逗号分隔的形参,参数即函数式接口里面方法的参数;第二部分为一个箭头符号:->
;第三部分为方法体,可以是表达式和代码块。语法如下:
parameter -> expression body
下面列举了Lambda表达式的几个最重要的特征:
可选的类型声明:你不用去声明参数的类型。编译器可以从参数的值来推断它是什么类型。
可选的参数周围的括号:你可以不用在括号内声明单个参数。但是对于很多参数的情况,括号是必需的。
可选的大括号:如果表达式体里面只有一个语句,那么你不必用大括号括起来。
可选的返回关键字:如果表达式体只有单个表达式用于值的返回,那么编译器会自动完成这一步。若要指示表达式来返回某个值,则需要使用大括号。
函数式接口的重要属性是:我们能够使用 Lambda 实例化它们,Lambda 表达式让你能够将函数作为方法参数,或者将代码作为数据对待。Lambda 表达式的引入给开发者带来了不少优点:在 Java 8 之前,匿名内部类,监听器和事件处理器的使用都显得很冗长,代码可读性很差,Lambda 表达式的应用则使代码变得更加紧凑,可读性增强;Lambda 表达式使并行操作大集合变得很方便,可以充分发挥多核 CPU 的优势,更易于为多核处理器编写代码。引用自IBM - Java 8 新特性概述。
2.2 一个Lambda表达式的例子
下面尝试写一些代码来理解Lambda表达式。请在NewFeaturesTester.java
中输入下面这些代码,对于它们的解释在注释中给出。
package com.shiyanlou.java8;
public class NewFeaturesTester {
public static void main(String args[]){
NewFeaturesTester tester = new NewFeaturesTester();
// 带有类型声明的表达式
MathOperation addition = (int a, int b) -> a + b;
// 没有类型声明的表达式
MathOperation subtraction = (a, b) -> a - b;
// 带有大括号、带有返回语句的表达式
MathOperation multiplication = (int a, int b) -> { return a * b; };
// 没有大括号和return语句的表达式
MathOperation division = (int a, int b) -> a / b;
// 输出结果
System.out.println("10 + 5 = " + tester.operate(100, 2, addition));
System.out.println("10 - 5 = " + tester.operate(100, 2, subtraction));
System.out.println("10 x 5 = " + tester.operate(100, 2, multiplication));
System.out.println("10 / 5 = " + tester.operate(100, 2, division));
// 没有括号的表达式
GreetingService greetService1 = message ->
System.out.println("Hello " + message);
// 有括号的表达式
GreetingService greetService2 = (message) ->
System.out.println("Hello " + message);
// 调用sayMessage方法输出结果
greetService1.sayMessage("Shiyanlou");
greetService2.sayMessage("Classmate");
}
// 下面是定义的一些接口和方法
interface MathOperation {
int operation(int a, int b);
}
interface GreetingService {
void sayMessage(String message);
}
private int operate(int a, int b, MathOperation mathOperation){
return mathOperation.operation(a, b);
}
}
接下来我们来编译一下,点击上方工具栏的Run
按钮。
运行结果如下图所示:
需要注意的是:
Lambda表达式优先用于定义功能接口在行内的实现,即单个方法只有一个接口。在上面的例子中,我们用了多个类型的Lambda表达式来定义MathOperation接口的操作方法。然后我们定义了GreetingService的sayMessage的实现。
Lambda表达式让匿名类不再需要,这位Java增添了简洁但实用的函数式编程能力。
2.3 作用域
通过使用Lambda表达式,你可以引用final变量或者有效的final变量(只赋值一次)。如果一个变量被再次赋值,Lambda表达式将抛出一个编译错误。
我们可以通过下面这段代码来学习Lambda的作用域。请将代码修改至如下这些:
package com.shiyanlou.java8;
public class NewFeaturesTester {
final static String salutation = "Hello ";
public static void main(String args[]){
GreetingService greetService1 = message ->
System.out.println(salutation + message);
greetService1.sayMessage("Shiyanlou");
}
interface GreetingService {
void sayMessage(String message);
}
}
点击编译运行,可以看到输出结果如下图所示。
三、方法引用
Java 8中方法也是一种对象,可以By名字来引用。不过方法引用的唯一用途是支持Lambda的简写,使用方法名称来表示Lambda。不能通过方法引用来获得诸如方法签名的相关信息。引用自永无止境,上下求索的博客。
方法引用可以通过方法的名字来引用其本身。方法引用是通过::
符号(双冒号)来描述的。
它可以用来引用下列类型的方法:- 静态方法- 实例方法- 使用new
操作符的构造器方法(TreeSet::new
)
更多对于方法引用的介绍,可以参考这一篇博文——《Java 8之方法引用(Method References)》。
3.1 一个方法引用的例子
请继续修改Eclipse中的代码,学习如何使用方法引用。
package com.shiyanlou.java8;
import java.util.List;
import java.util.ArrayList;
public class NewFeaturesTester {
public static void main(String args[]){
List names = new ArrayList();
names.add("Peter");
names.add("Linda");
names.add("Smith");
names.add("Zack");
names.add("Bob");
// 通过System.out::println引用了输出的方法
names.forEach(System.out::println);
}
}
编译并运行,结果如下图所示:
四、实验总结
本节我们讲解了如何使用Lambda表达式和方法引用。Lambda大概是使用Java 8版本编程最常涉及到的一个技巧,建议在适用的场合多用它代替之前的习惯写法。
Java 8 其他新特性例如函数式接口、默认方法、Optional、Streams(流)、Data/Time API、Base64编码等,可以在实验楼免费查看,实验楼提供了教程配套的在线练习环境:
https://www.shiyanlou.com/courses/539
另外在学习过程中,应当随时保持查阅官方文档的习惯。
相关推荐
- JDK从8升级到21的问题集(jdk8版本)
-
一、背景与挑战1.升级动因oOracle长期支持策略o现代特性需求:协程、模式匹配、ZGC等o安全性与性能的需求oAI新技术引入的版本要求2.项目情况o100+项目并行升级的协同作战o多技术栈并存o持...
- 科莱特SAP ABAP干货 | 基础篇:二、数据字典(1)
-
ABAP开发基础及应用二、数据字典(1)目标及说明目标:1、掌握SAP数据字典各种对象的定义和使用2、能根据业务数据要求,建立存储数据用的表和视图需求说明:1、在SAP中自建程序,以对一企业(自由行集...
- Mycat入门(mycatalog)
-
一、Linux系统下搭建Mycat注:如果没有服务器可以选择虚拟机进行操作1、首先准备好服务器或者虚拟机2、安装和配置MySQL数据库2.1、删除原来的数据库//查询已安装的mariadb[root...
- MySQL从入门到实战:表设计、索引优化与高频面试解析
-
一、业务场景驱动表设计:电商订单系统案例场景背景某电商平台需设计用户、商品、订单模块,要求支持以下操作:用户高频查询最新订单按商品分类+价格区间筛选商品统计每日订单金额建表实战--用户表(反范式设计...
- oracle生成AWR报告的两种方法(oracle中awr报告的输出格式有哪些)
-
方法1:sqlplus中执行:execdbms_workload_repository.create_snapshot();@?/rdbms/admin/awrrpt.sql方法2:setpage...
- Navicat Premium:数据库管理神器(navicat 本地数据库)
-
提供免费下载网站Mavom.cn在数据库管理的世界里,「NavicatPremium」是一款「一体化的数据库管理和迁移工具」,适用于MySQL、SQLServer、Oracle和PostgreSQ...
- Iperius Backup功能特色(backup如何使用)
-
备份作业:1.文件夹备份:本地的文件夹,带SMB的路径文件夹,网络路径文件夹,NAS文件夹等等2.文件备份:对某个文件进行备份3.备份镜像:可以把系统刻录成镜像用于恢复(图1)4.FTP:自带FTP...
- sql注入攻击,拿到网站账户,黑客这样神操作
-
首先的话,我们来仔细搞清楚这个攻击的流程,第一步就是了解一下,什么是sql?又什么是sql注入、sql注入的流程和步骤。1、首先什么是sql,Sql是一种数据库查询和程序设计的语言,这里的数据库是指存...
- Java 8 新特性指南(java的八大特性)
-
本教程可以在实验楼(shiyanlou.com)中在线练习。一、实验简介Java8是近年来最后起来的一个Java编程语言发行版本。Oracle在2014年3月发布了它。该版本为Java带来...
- Java系统开发从入门到精通第三讲(文字版)
-
下来我们进入数据持久化的部分,对于一个真实的业务系统,能够正常的运转离不开数据的持久化。在数据持久化这块,目前主流的还是关系型数据库(RDBMS),NoSQL(NewSQL)也有了长足发展,特别在大数...
- 扣细节:while (true) 和 for (;;) 哪个更快
-
来源:zhihu.com/question/52311366/answer/130090347在JDK8u的jdk项目下做个很粗略的搜索:mymbp:/Users/me/workspace/jdk8u...
- JAVA 8 环境安装配置(java环境怎么装)
-
一、下载这里选择的是OracleJDK,首先到Oracle官网下载JDK8,以Windows10操作系统为例,若是32位系统则下载“Windowsx86”,否则64位系统下载“Windows...
- 从零开始学Java系列之最详细的Java环境变量配置教程
-
前言:在上一篇文章中,壹哥给大家重点讲解了Java实现跨平台的原理,不知道你现在有没有弄清楚呢?如果你还有疑问,可以在评论区留言~之前的三篇文章,主要是理论性的内容,其实你暂时跳过不看也是可以的,我们...
- Linux下乱码的文件名修改或删除(linux文件名乱码如何处理)
-
查看文件名#lstouch1?.txt#ll-itotal1469445217956913-rw-r--r--1oracleoinstall0Jan18...
- 「论文写作-解决方案」数据库TDE加密
-
数据是应用的核心。对于绝大多数应用,存储数据的数据库是系统日常管理的重中之重。数据库安全背景根据verizon2014年的统计数据,96%数据攻击行为是针对数据库进行的。数据库已经成为外部入侵与内部渗...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- oracle位图索引 (74)
- oracle批量插入数据 (65)
- oracle事务隔离级别 (59)
- oracle 空为0 (51)
- oracle主从同步 (55)
- oracle 乐观锁 (51)
- redis 命令 (78)
- php redis (88)
- redis 存储 (66)
- redis 锁 (69)
- 启动 redis (66)
- redis 时间 (56)
- redis 删除 (67)
- redis内存 (57)
- redis并发 (52)
- redis 主从 (69)
- redis 订阅 (51)
- redis 登录 (54)
- redis 面试 (58)
- 阿里 redis (59)
- redis 搭建 (53)
- redis的缓存 (55)
- lua redis (58)
- redis 连接池 (61)
- redis 限流 (51)