专栏汇总:Java8 新特性
专栏汇总:Java8 新特性Java 更新的很快,但我的知识储备还停留在 Java 7 的年代…是我们落伍了,还是这个社会不需要我们这么超前。但如果有一天,你自己能做主了,你会上 最新版本 吗? 不管如何,先把 Java8 学习了 二十、Java 8 函数接口 ( Functional interface ) 十九、Java 8 流 Stream ( 下 ) 十八、Java 8 流 Stream ( 上 ) 十七、Java 8 新日期时间 API ( 下 ) – 格式化 十六、Java 8 新日期时间 API ( 中 ) – 时区日期时间 十五、Java 8 新日期时间 API ( 上 ) – 本地日期时间 十四、Java 8 Nashorn JavaScript 十三、Java 8 可选值 java.util.Optional 类 十二、Java 8 集合遍历 forEach() 方法 十一、Java 8 接口静态方法 十、Java 8 接口 ( interface ) 默认方法 八、Java 8 Lambda 表达式 ( 下 )范例 ...
专栏汇总:Java并发
专栏汇总:Java并发整个系列文章为Java并发专题,一是自己的兴趣,二是,这部分在实际理解上很有难度,另外在面试过程中也是经常被问到。所以在学习过程中,记录了Java并发相关的基础知识,一是自己对知识能够建立体系,同时也希望有幸能够对其他人有用。 十九、Java并发 Java wait() 和 notify() 方法 十八、Java并发 Java 之 Runnable 还是 Thread ? 十七、Java并发 Java Thread 生命周期 十六、Java并发 Java ThreadLocalRandom 十五、Java并发 Java java.util.concurrent.Future 十四、Java并发 Java 守护线程 ( Daemon Thread ) 十三、Java并发 Java java.util.concurrent.Locks 十二、Java并发 Java BlockingQueue 十一、Java并发 Java CountDownLatch 十、Java并发系列之 Java 并发编程面试题 九、Java并发 ...
二十、Java 8 函数接口 ( Functional interface )
二十、Java 8 函数接口 ( Functional interface )Java 8 引入了 「 函数接口 」 ( funtional interface ) 的概念,「 函数接口 」就是那些有且只有显式定义一个方法的接口。 例如,具有单个方法 compareTo() 的接口 Comparable 接口,它只有一个功能,就是用于比较。 这种函数接口一般用于 Java 8 中的 Lambda 表达式 。 而且 Java 8 为了支持 Lambda 表达式,更是定义了许多函数接口。这些接口基本都在 java.util.function 包中。 函数接口函数接口为 Java 8 Lambda 表达式和方法引用提供目标类型。每个函数接口都有一个 虚 ( abstract ) 方法,成为该函数接口的函数方法。用于适配该类型的 Lambda 表达式的参数类型和返回值类型。 函数接口可以在多个上下文中提供目标类型,例如赋值上下文,方法调用或强制转换上下文。 我们写一小段代码演示下 12345678// Assignment contextPredicate<String> p = ...
十九、Java 8 流 Stream ( 下 )
十九、Java 8 流 Stream ( 下 )上一章节 Java 8 流 Stream ( 上 ) 因为时间关系,我们介绍到一半半就停止了。本章节我们继续。 limit() 方法limit() 方法用于减少( 限制 ) 流中的元素数量。 例如下面的代码段演示了如何使用 limit() 方法只输出 10 个随机数 12Random random = new Random();random.ints().limit(10).forEach(System.out::println); sorted() 方法sorted() 方法用于给流中的元素进行排序。 下面的范例演示了如何按照排序顺序打印 10 个随机数 12Random random = new Random();random.ints().limit(10).sorted().forEach(System.out::println); 并发处理parallelStream() 是需要并发处理的流的替代方案。stream() 方法产生的流只能是串行处理,可以理解为只在一个线程中,按照流中元素的顺序一个接一个的处理。 而并发处理,就 ...
十八、Java 8 流 Stream ( 上 )
十八、Java 8 流 Stream ( 上 )流 ( Stream ) 是 Java 8 新增加的一个重磅级的功能。流是一个抽象层。有了流,我们就可以使用类似于 SQL 语句的声明方式来处理数据。 比如,下面的 SQL 语句 1SELECT max(grade), student_id, student_name FROM Students; 上面这条 SQL 会自动返回最高学习绩点的学生的信息,而全程,开发人员却不用直接面对任何计算和比较。 在流 ( Stream ) 出现之前,对于Java 中的集合框架的使用。开发人员不得不一次次的写一个循环,一次次的重复检查。当然了,这也什么,毕竟大家都是这样过来的。 更大的问题在于开发效率。面对当前的多核 CPU 计算机,面对并发编程。我们开发者常常会写出非常容易出错的并发执行的代码。 为了解决这些问题,Java 8 引入了流 ( Stream ) 这个概念,允许开发人员以声明的方式处理数据的同时,还能利用多核构架,而无需编写任何特殊的代码。 流是什么 ?Java 中的 流 ( Stream ) 表示来自 源 ( source ) 的一系列 ...
十七、Java 8 新日期时间 API ( 下 ) – 格式化
十七、Java 8 新日期时间 API ( 下 ) – 格式化Java 8 似乎也对 java.text.SimpleDateFormat 也不太满意,竟然重新创建了一个 java.time.format 包,该包下包含了几个类和枚举用于格式化日期时间。 java.time.format 包java.time.format 包提供了以下几个类用于格式化日期时间 类 说明 DateTimeFormatter 用于打印和解析日期时间对象的格式化程序 DateTimeFormatterBuilder 创建日期时间格式化样式的构建器 DecimalStyle 日期和时间格式中使用的本地化十进制样式 java.time.format 包还提供了以下几个枚举,包含了常见的几种日期时间格式。 枚举 说明 FormatStyle 包含了本地化日期,时间或日期时间格式器的样式的枚举 ResolverStyle 包含了解决日期和时间的不同方法的枚举 SignStyle 包含了如何处理正/负号的方法的枚举 TextStyle 包含了文本格式和解析的样式的枚举 ...
十六、Java 8 新日期时间 API ( 中 ) – 时区日期时间
十六、Java 8 新日期时间 API ( 中 ) – 时区日期时间上一章节 Java 8 新日期时间 API ( 上 ) – 本地日期时间 我们对 Java 8 重新设计的日期时间 API 做了一些基础的介绍,同时详细介绍了和本地时间有关的几个类 LocalDateTime 、LocalDate 和 LocalTime 。 我同时也发现,这三个类没有任何时区相关的信息,但也不能说它们没处理时区,而只能说它们有选择的隐藏了时区的处理。它们内部会使用操作系统当前的时区。 以此同时,Java 在 java.time 包中也提供了几个类用于处理需要关注时区的日期时间 API。它们是 java.time.ZonedDateTime 和 java.time.ZoneId。前者用于处理需要时区的日期时间,后者用于处理时区。 ZonedDateTime 和 LocalDateTime 类似,几乎有着相同的 API。从某些方面说,ZonedLocalTime 如果不传递时区信息,那么它会默认使用操作系统的时区,这样,结果其实和 LocalDateTime 是类似的。 比如,我们可以使用 ZonedDa ...
十五、Java 8 新日期时间 API ( 上 ) – 本地日期时间
十五、Java 8 新日期时间 API ( 上 ) – 本地日期时间作为开发者,经常需要处理日期时间。如果你跟随者 Java 5 一路走来,那么一定会对 java.util.Date 、java.util.Calendar 、java.util.GregoiranCalendar 和 java.text.SimpleDateFormat 四大类非常熟悉,它们分别用于处理日期、日历、日历表示、日期时间格式化。 这四个类,对于编程老人来讲,应该是习惯了,但对于编程新人来讲,就有好多疑问,有好多陷阱和坑等着它们跳,比如 1、 非线程安全:java.util.Date 并不是线程安全的。开发者在使用这个类时必须自己处理多线程并发问题。2、 设计不佳 :一方面日期和日期格式化分布在多个包中。另一方面,java.util.Date 的默认日期,年竟然是从 1900 开始,月从 1 开始,日从 0 开始,没有统一性。而且 Date 类也缺少直接操作日期的相关方法。3、 时区处理困难:因为设计不佳,开发人员不得不编写大量代码来处理时区问题。4、 还有其它一些问题 面对种种问题,Java 8 终于重新设 ...
十四、Java 8 Nashorn JavaScript
十四、Java 8 Nashorn JavaScript对于 Java 中的 JavaScript 引擎, Java 8 引入了 Nashorn 来代替原先的 Rhino。 Nashorn 使用 Java 7 中引入的调用动态特性,且直接编译内存中的代码并将字节码传递给 JVM。这两项改进,直接给 Nashorn 带了至少 2 到 10 倍的性能提升。 jjs在 Nashorn JavaScript 引擎中。JAVA 8 引入了一个新的命令行工具 jjs,用于在控制台执行 javascript 代码。 例如我们可以在当前目录下 ( 任意位置 ) 创建一个 JavaScript 文件 hello.js ,然后输入以下内容 1print('你好,A,B !'); 保存文件后,使用下面的 jjs 命令运行它 1jjs hello.js 运行结果如下 12$ jjs hello.js你好,A,B ! jjs 交互式解释器我们也可以直接在命令行中输出 jjs 进入 Java 8 提供的 jjs 交互式解释器。 12$ jjsjjs> 然后输入一些 JavaSc ...
十三、Java 8 可选值 java.util.Optional 类
十三、Java 8 可选值 java.util.Optional 类在不考虑竖起来的情况下,抛一个硬币,落地时,显示正面的情况只有两种:是正面和不是正面。很多时候,这是一个 「 谓词 」,也就是返回布尔类型 ( bool )。但有时候,我们需要返回另一种类型:存在 和 空。 存在 就是硬币落地时显示为正面 空 就是硬币落地式显示的不是正面。 从另一方面说,结果就是 有值 和 空 。 一个类,如果可以同时表示 有值 和 空 ,我们称这种类为 可选类 ( Optional ) 从某些方面说,Optional 类型就是 「那里有一个值,它等于 x,或者那里没有那个值」 JAVA 8 java.util.Optional 类Java 8 在 java.util 包中添加了一个新的类 Optional 。 Optional 类是一个容器,用于表示可能包含也可能不包含非 null 值。如果存在值,isPresent() 方法将返回 true,get() 将返回该值。 Optional 类提供了许多方法用于处理 「 可用 」 或 「 不可用 」 ,而不是简单的检查空值情况。 java.util. ...
十二、Java 8 集合遍历 forEach() 方法
十二、Java 8 集合遍历 forEach() 方法Java 8 为所有的集合添加了一个新的方法 forEach() ,该方法以只读形式遍历集合所有的元素并为每一个元素执行一个动作。 我们先来看一个范例 ForEachTester.java123456789import java.util.Arrays;public class ForEachTester{ public static void main(String[] args) { Arrays.asList("你好", "A", "B ").forEach(System.out::println); }} 上面这段代码中,我们使用了 forEach 方法遍历列表的每一个元素,并把元素传递给 System.out.println() 方法打印输出到屏幕上。 对于这个功能,如果我们使用 for ( : ) 语法,则会又有些小复杂 1234567891011121314import java.uti ...
十一、Java 8 接口静态方法
十一、Java 8 接口静态方法Java 8 除了给接口带来了 默认方法之外,还给接口带来了 静态方法。而且,Java 8 中的静态方法还可以有具体的实现。 我们都知道,在 Java 7 及之前的版本中,接口 interface 是不允许有静态方法声明的,例如下面的代码 InterfaceStaticMethodTester.java12345678910public class InterfaceStaticMethodTester{ public static void main(String[] args) { } interface Greeter { public static void greeter(String name); }} 在 Java 7 版本下,编译会报错 1234InterfaceDefaultMethodTester.java:8: 错误: 此处不允许使用修饰符static public static void greeter(Stri ...
十、Java 8 接口 ( interface ) 默认方法
十、Java 8 接口 ( interface ) 默认方法总所周知,在 Java 7 和之前的版本中,接口 interface 是不能包含具体的方法实现的。 比如,下面的代码,是会报错的。 1234567891011121314public class InterfaceDefaultMethodTester{ public static void main(String[] args) { } interface Greeter { public void greeter(String name) { Syste.out.println("你好," + name ); } }} 运行结果如下 1234InterfaceDefaultMethodTester.java:10: 错误: 接口抽象方法不能带有主体 { ^1 个错误 如果一个接口有多个实现, ...
八、Java 8 Lambda 表达式 ( 下 )范例
八、Java 8 Lambda 表达式 ( 下 )范例经过 Java 8 Lambda 表达式 ( 上 )- 简介 和 Java 8 Lambda 表达式 ( 中 )- 外部参数 两个章节的学习,想必你已经对 Java 8 中的 Lambda 表达式已经非常熟悉了。 本章节我们就来回顾下上面两章节的所学知识,然后写一些范例巩固下。 回顾 lambda 表达式是 java 8 引入的最重要的功能之一。 lambda 表达式为那些只包含一个方法的接口提供了简洁代码,例如函数接口 ( function interface )。 lambda 表达式还为集合的迭代提供了一种更为简单的方式。 对于那些使用匿名类或内部类实现的单个方法接口,在 Java 8 中,可以使用 lambda 表达式来实现。不仅功能相同,而且代码更简洁。 lambda 表达式真正的原理,是 「 为那些函数接口定义了它们包含的唯一方法,而且返回函数接口的实例 」 lambda 表达式语法lambda 表达式语法非常易于阅读和理解 lambda 表达式语法看起来像 1(Argument part) -> Body ...