java8学习(1)-- 脑图(九大特性)

简介: java8学习(1)-- 脑图(九大特性)

脑图


1dc618a0ed9580ce8bfa6facb208c08f.png


代码地址:


https://github.com/hufanglei/daily-code/tree/first-java8/src/com/java8demo


jdk8


一、lambda


1.本质


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


2.语法


可选类型声明

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

可选的参数圆括号

一个参数无需定义圆括号,但多个参数需要定义圆括号

可选的大括号

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

可选的返回关键字

如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。


3.应用案例


4种可以简写的方式 简写参数类型,简写参数括号,简写方法主体的大括号,简写返回值,自定义方法类型接口:类似js的回调函数,比js笨重,需要,指定回调函数名和方法名,而js不需要


变量作用域


lambda 表达式只能引用标记了 final 的外层局部变量


内部final变量访问


1.lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)


2,.在 Lambda 表达式当中不允许声明一个与局部变量同名的参数或者局部变量。

ambda简化匿名内部类案例:


本质


在匿名内部类中,有很多内容都是冗余的。


比如在使用匿名内部类实现多线程的代码中。


因为 Thread 构造方法中需要传递 Runnable 接口类型的参数,所以我们不得不 new Runnable。


因为要重写 Runnable 中的 run 方法,所以不得不写了public void run。


整个匿名内部类中最关键的东西是方法,方法中最关键的有前中后三点。


前:参数。


中:方法体


后:返回值


最好的情况是只关注匿名内部类中最核心的这些内容(方法参数,方法体,返回值)如果使用Lambda表达式,可以只关注最核心的内容,Lambda 表达式是匿名内部类的简化写法。


demo


lambda实现runable接口

lambda 实现集合排序

Lambda 表达式对中文排序


二.方法引用


1.方法引用通过方法的名字来指向一个方法。


2. 分类


构造器引用


Car::new


静态方法引用


Car::staticMethod


特定类的任意对象的方法引用


Car::method


特定对象的方法引用


car::method


三、函数式接口


1.函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。


2.函数式接口可以被隐式转换为 lambda 表达式


3.java.util.function 包


Supplier

Consumer

Function

Operator


4.注意


@FunctionalInterface


主要用于编译级错误检查,加上该注解,当你写的接口不符合函数式接口定义的时候,编译器会报错

函数式接口里允许定义静态方法

函数式接口里允许定义 java.lang.Object 里的 public 方法

函数式接口里是可以包含Object里的public方法,这些方法对于函数式接口来说,不被当成是抽象方法(虽然它们是抽象方法);因为任何一个函数式接口的实现,默认都继承了 Object 类,包含了来自 java.lang.Object 里对这些抽象方法的实现;


四、默认方法


1、定义


默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。


只需在方法名前面加个 default 关键字即可实现默认方法


为什么要有这个特性


当需要修改接口时候,需要修改全部实现该接口的类,目前的 java 8 之前的集合框架没有 foreach 方法,通常能想到的解决办法是在JDK里给相关的接口添加新的方法及实现。然而,对于已经发布的版本,是没法在给接口添加新方法的同时不影响已有的实现。所以引进的默认方法。他们的目的是为了解决接口的修改与现有的实现不兼容的问题。


2.多个默认方法


解决方案

Vehicle.super.print();


3.静态默认方法

可以声明(并且可以提供实现)静态方法


五、stream


1.本质


来自数据源的元素队列并支持聚合操作

元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。


2.数据源流的来源


集合,数组,I/O channel, 产生器generator


3.聚合操作


类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等


4.特别注意点


Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。


内部迭代


以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现


5.生成流方式


stream() − 为集合创建串行流

parallelStream() − 为集合创建并行流


6.实操


stream forEach

map

filter count

limit sorted

Collectors 规约

tolist

joining

统计summaryStatistics

max

min

avg

sum


六、Optional 类


1.定义


是一个可以为null的容器对象

如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象

它可以保存类型T的值,或者仅仅保存null

Optional提供很多有用的方法,这样我们就不用显式进行空值检测


2. 好处


Optional 类的引入很好的解决空指针异常


3.实操


ofNullable

允许传递为 null 参数

of

如果传递的参数是 null,抛出异常 NullPointerException

isPresent

判断值是否存在,存在则返回true,不存在则返回false

orElse

果值存在,返回它,否则返回默认值

get

获取值,值需要存在


七、Nashorn JavaScript


1.定义


Nashorn 一个 javascript 引擎

从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引擎

Nashorn完全支持ECMAScript 5.1规范以及一些扩展

它使用基于JSR 292的新语言特性,其中包含在JDK 7中引入的 invokedynamic,将JavaScript编译成Java字节码

与先前的Rhino实现相比,这带来了2到10倍的性能提升


2.jjs


jjs 交互式编程

传递参数


3.Java 中调用 JavaScript


4.JavaScript 中调用 Java


八、日期时间 API


1.旧版的 Java 中,日期时间 API 存在诸多问题


非线程安全 − java.util.Date 是非线程安全的,所有的日期类都是可变的


2.设计很差 −


在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义

时区处理麻烦


日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类


3.Date-Time API (JSR 310)


Local(本地) − 简化了日期时间的处理,没有时区的问题

Zoned(时区) − 通过制定的时区处理日期时间。


4.实操


本地化日期时间 API

LocalDateTime

toLocalDate

getDayOfMonth getSecond()

withDayOfMonth withYear

LocalDate

of

LocalTime

parse

使用时区的日期时间API

ZonedDateTime

parse

ZoneId

of

systemDefault


九、Base64


①1.8中引入了Base64,不在需要引入第三方库就可以使用base64了


②内嵌类


解码Base64.Decoder

getDecoder()

getMimeDecoder()

getUrlDecoder()

编码Base64.Encoder


相关文章
|
2月前
|
存储 安全 Java
Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
【10月更文挑战第17天】Java Map新玩法:探索HashMap和TreeMap的高级特性,让你的代码更强大!
78 2
|
2月前
|
存储 Java
深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。
【10月更文挑战第16天】本文深入探讨了Java集合框架中的HashSet和TreeSet,解析了两者在元素存储上的无序与有序特性。HashSet基于哈希表实现,添加元素时根据哈希值分布,遍历时顺序不可预测;而TreeSet利用红黑树结构,按自然顺序或自定义顺序存储元素,确保遍历时有序输出。文章还提供了示例代码,帮助读者更好地理解这两种集合类型的使用场景和内部机制。
48 3
|
2月前
|
存储 Java 数据处理
Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位
【10月更文挑战第16天】Java Set接口凭借其独特的“不重复”特性,在集合框架中占据重要地位。本文通过快速去重和高效查找两个案例,展示了Set如何简化数据处理流程,提升代码效率。使用HashSet可轻松实现数据去重,而contains方法则提供了快速查找的功能,彰显了Set在处理大量数据时的优势。
38 2
|
2月前
|
存储 算法 Java
Java Set因其“无重复”特性在集合框架中独树一帜
【10月更文挑战第14天】Java Set因其“无重复”特性在集合框架中独树一帜。本文深入解析Set接口及其主要实现类(如HashSet、TreeSet)如何通过特定的数据结构(哈希表、红黑树)确保元素唯一性,并提供最佳实践建议,包括选择合适的Set实现类和正确实现自定义对象的`hashCode()`与`equals()`方法。
36 3
|
2月前
|
XML Java 编译器
Java学习十六—掌握注解:让编程更简单
Java 注解(Annotation)是一种特殊的语法结构,可以在代码中嵌入元数据。它们不直接影响代码的运行,但可以通过工具和框架提供额外的信息,帮助在编译、部署或运行时进行处理。
100 43
Java学习十六—掌握注解:让编程更简单
|
16天前
|
存储 Java 开发者
什么是java的Compact Strings特性,什么情况下使用
Java 9引入了紧凑字符串特性,优化了字符串的内存使用。它通过将字符串从UTF-16字符数组改为字节数组存储,根据内容选择更节省内存的编码方式,通常能节省10%至15%的内存。
|
25天前
|
存储 Java 数据挖掘
Java 8 新特性之 Stream API:函数式编程风格的数据处理范式
Java 8 引入的 Stream API 提供了一种新的数据处理方式,支持函数式编程风格,能够高效、简洁地处理集合数据,实现过滤、映射、聚合等操作。
41 6
|
1月前
|
分布式计算 Java API
Java 8引入了流处理和函数式编程两大新特性
Java 8引入了流处理和函数式编程两大新特性。流处理提供了一种声明式的数据处理方式,使代码更简洁易读;函数式编程通过Lambda表达式和函数式接口,简化了代码书写,提高了灵活性。此外,Java 8还引入了Optional类、新的日期时间API等,进一步增强了编程能力。这些新特性使开发者能够编写更高效、更清晰的代码。
35 4
|
1月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
1月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。