Java8引入了「函数接口」(funtionalinterface)的概念,「函数接口」就是那些有且只有显式定义一个方法的接口。例如,具有单个方法compareTo()的接口Comparable接口,它只有一个功能,就是用于比较。这种函数接口一般用于Java8中的Lambda表达式。而且Java8为了支持Lambda表达式,更是定义了许多函数接口。这些接口基本都在java.util.function包中。函数接口函数接口为Java8Lambda表达式和方法引用提供目标类型。每个函数接口都有一个虚(abstract)方法,成为该函数接口的函数方法。用于适配该类型的Lambda表达式的参数类型和返
上一章节Java8流Stream(上)因为时间关系,我们介绍到一半半就停止了。本章节我们继续。limit()方法limit()方法用于减少(限制)流中的元素数量。例如下面的代码段演示了如何使用limit()方法只输出10个随机数Randomrandom=newRandom();random.ints().limit(10).forEach(System.out::println);sorted()方法sorted()方法用于给流中的元素进行排序。下面的范例演示了如何按照排序顺序打印10个随机数Randomrandom=newRandom();random.ints().limit(10).so
流(Stream)是Java8新增加的一个重磅级的功能。流是一个抽象层。有了流,我们就可以使用类似于SQL语句的声明方式来处理数据。比如,下面的SQL语句SELECTmax(grade),student_id,student_nameFROMStudents;上面这条SQL会自动返回最高学习绩点的学生的信息,而全程,开发人员却不用直接面对任何计算和比较。在流(Stream)出现之前,对于Java中的集合框架的使用。开发人员不得不一次次的写一个循环,一次次的重复检查。当然了,这也什么,毕竟大家都是这样过来的。更大的问题在于开发效率。面对当前的多核CPU计算机,面对并发编程。我们开发者常常会写出非
Java8似乎也对java.text.SimpleDateFormat也不太满意,竟然重新创建了一个java.time.format包,该包下包含了几个类和枚举用于格式化日期时间。java.time.format包java.time.format包提供了以下几个类用于格式化日期时间类说明DateTimeFormatter用于打印和解析日期时间对象的格式化程序DateTimeFormatterBuilder创建日期时间格式化样式的构建器DecimalStyle日期和时间格式中使用的本地化十进制样式java.time.format包还提供了以下几个枚举,包含了常见的几种日期时间格式。枚举说明For
上一章节Java8新日期时间API(上)-本地日期时间我们对Java8重新设计的日期时间API做了一些基础的介绍,同时详细介绍了和本地时间有关的几个类LocalDateTime、LocalDate和LocalTime。我同时也发现,这三个类没有任何时区相关的信息,但也不能说它们没处理时区,而只能说它们有选择的隐藏了时区的处理。它们内部会使用操作系统当前的时区。以此同时,Java在java.time包中也提供了几个类用于处理需要关注时区的日期时间API。它们是java.time.ZonedDateTime和java.time.ZoneId。前者用于处理需要时区的日期时间,后者用于处理时区。Zon
作为开发者,经常需要处理日期时间。如果你跟随者Java5一路走来,那么一定会对java.util.Date、java.util.Calendar、java.util.GregoiranCalendar和java.text.SimpleDateFormat四大类非常熟悉,它们分别用于处理日期、日历、日历表示、日期时间格式化。这四个类,对于编程老人来讲,应该是习惯了,但对于编程新人来讲,就有好多疑问,有好多陷阱和坑等着它们跳,比如非线程安全:java.util.Date并不是线程安全的。开发者在使用这个类时必须自己处理多线程并发问题。设计不佳:一方面日期和日期格式化分布在多个包中。另一方面,jav
对于Java中的JavaScript引擎,Java8引入了Nashorn来代替原先的Rhino。Nashorn使用Java7中引入的调用动态特性,且直接编译内存中的代码并将字节码传递给JVM。这两项改进,直接给Nashorn带了至少2到10倍的性能提升。jjs在NashornJavaScript引擎中。JAVA8引入了一个新的命令行工具jjs,用于在控制台执行javascript代码。例如我们可以在当前目录下(任意位置)创建一个JavaScript文件hello.js,然后输入以下内容print('你好,简单教程,简单编程!');保存文件后,使用下面的jjs命令运行它jjshello.js运行
在不考虑竖起来的情况下,抛一个硬币,落地时,显示正面的情况只有两种:是正面和不是正面。很多时候,这是一个「谓词」,也就是返回布尔类型(bool)。但有时候,我们需要返回另一种类型:存在和空。存在就是硬币落地时显示为正面空就是硬币落地式显示的不是正面。从另一方面说,结果就是有值和空。一个类,如果可以同时表示有值和空,我们称这种类为可选类(Optional)从某些方面说,Optional类型就是「那里有一个值,它等于x,或者那里没有那个值」JAVA8java.util.Optional类Java8在java.util包中添加了一个新的类Optional。Optional类是一个容器,用于表示可能包
Java8为所有的集合添加了一个新的方法forEach(),该方法以只读形式遍历集合所有的元素并为每一个元素执行一个动作。我们先来看一个范例ForEachTester.javaimportjava.util.Arrays;publicclassForEachTester{publicstaticvoidmain(String[]args){Arrays.asList("你好","简单教程","简单编程").forEach(System.out::println);}}上面这段代码中,我们使用了forEach方法遍历列表的每一个元素,并
Java8除了给接口带来了默认方法之外,还给接口带来了静态方法。而且,Java8中的静态方法还可以有具体的实现。我们都知道,在Java7及之前的版本中,接口interface是不允许有静态方法声明的,例如下面的代码InterfaceStaticMethodTester.javapublicclassInterfaceStaticMethodTester{publicstaticvoidmain(String[]args){}interfaceGreeter{publicstaticvoidgreeter(Stringname);}}在Java7版本下,编译会报错[yufei@www.twle.
总所周知,在Java7和之前的版本中,接口interface是不能包含具体的方法实现的。比如,下面的代码,是会报错的。publicclassInterfaceDefaultMethodTester{publicstaticvoidmain(String[]args){}interfaceGreeter{publicvoidgreeter(Stringname){Syste.out.println("你好,"+name);}}}运行结果如下[yufei@www.twle.cnhelloworld]$javacInterfaceDefaultMethodTester.java&
Java8中新增加了方法引用这个概念。但,什么是方法引用呢?我们先来看一个例子,下面这个范例演示了如何遍历字符串列表并进行一些操作LambdaTester.javaimportjava.util.Arrays;importjava.util.List;importjava.util.function.Function;publicclassLambdaTester{publicstaticvoidmain(String[]args){LambdaTestertester=newLambdaTester();tester.run();}publicvoidrun(){List<String
经过Java8Lambda表达式(上)-简介和Java8Lambda表达式(中)-外部参数两个章节的学习,想必你已经对Java8中的Lambda表达式已经非常熟悉了。本章节我们就来回顾下上面两章节的所学知识,然后写一些范例巩固下。回顾lambda表达式是java8引入的最重要的功能之一。lambda表达式为那些只包含一个方法的接口提供了简洁代码,例如函数接口(functioninterface)。lambda表达式还为集合的迭代提供了一种更为简单的方式。对于那些使用匿名类或内部类实现的单个方法接口,在Java8中,可以使用lambda表达式来实现。不仅功能相同,而且代码更简洁。lambda表达
在Java8Lambda表达式(上)-简介章节中我们讲解了Java8Lambda表达式的一些基础知识。我们也了解Java8Lambda表达式的一些使用场景:JavaLambda表达式主要用于定义函数接口的内联实现。而函数接口,就是只包含了一个方法的接口。在前一章节中,我们使用了各种类型的lambda表达式来定义MathOperation接口的operation方法。JavaLambda表达式消除了对匿名类的需求,并为Java提供了非常简单但功能强大的函数编程功能。Java8Lambda表达式作用域(scope)因为Java8的lambda表达式其实是函数接口的内联实现,也就是匿名内部类,因此,
Lambda表达式在Java8中引入,并且被吹捧为Java8最大的特性。Lambda表达式是函数式编程的的一个重要特性,标志者Java向函数式编程迈出了重要的第一步。JavaLambda表达式语法JavaLambda表达式的语法结构如下parameter->expressionbody实际代码可能如下有参数且只有一条语句时(a,b)->a+b只有一个参数时a->a没有参数时()->System.out.println("简单教程")有多条语句时(a,b)->{intc=a+b;System.out.println("简单教程"
Javajava.util.Base64.Encoder类是java.util.Base64类的一个内部静态类。该类提供了一些方法用于将一些字节数据编码为Base64格式的数据。(JAVA>=8)java.util.Base64.Encoder类java.util.Base64.Encoder类的定义如下publicstaticclassBase64.EncoderextendsObjectjava.util.Base64.Encoder类实现了一个编码器,使用RFC4648和RFC2045中规定的Base64编码方案对字节数据进行编码。java.util.Base64.Encoder类
Javajava.util.Base64.Decoder类是java.util.Base64类的一个内部静态类。该类提供了一些方法用于解码Base64格式的数据。(JAVA>=8)java.util.Base64.Decoder类java.util.Base64.Decoder类的定义如下publicstaticclassBase64.DecoderextendsObjectjava.util.Base64.Decoder类实现了一个解码器,使用RFC4648和RFC2045中规定的Base64编码方案解码数据。Decode类接受Base64填充字符=并将其解释为编码数据的结尾。但=并不
Base64是一种常见的字符编码解码方式,一般用于将二进制数据编码为更具可读性的Base64进制格式。在Java6(JDK1.6)之前,JDK一直没有包含Base64的实现类。因此大部分人都使用Sum/OraleJDK里面的sun.misc.BASE64Encode和sun.misc.BASE64Decode。然后这也成为很多Java开发者的习惯。一直沿用到今天的Java8中还有人在用。JDK1.6虽然添加了Base64的实现。但是,非常隐秘,竟然是在javax.xml.bind包下的DatastypeConvert类中的两个静态方法parseBase64Binary和printBase64B
本章节我们重点来讲讲Java8中的RunnableLambda表达式。众所周知,Java8中的Runable和Callable两个接口都添加了@FunctionalInterface注解,因此我们可以直接使用Lambda表达式来代替它们的run()和call()方法Runnable表达式Java8开始支持Lambda表达式,所以,好像,一夜间,所有添加了@FunctionalInterface注解的方法都可以使用Lambda表达式来创建实例,Runnable也不例外,我们可以直接使用一个Lambda表达式来创建它的实例Runnabler=()->System.out.println(&q
本章节我们来详细讲讲Java8流(stream)收集器(Collectors)中的joining()方法。该方法会返回一个Collectors实例,方便在流收集器上的链式操作。Collectors.joining()方法以遭遇元素的顺序拼接元素。我们可以传递可选的拼接字符串、前缀和后缀joinning()方法定义假设我们的流中有四个元素["A","B","C","D"],那么我们就可以按照以下方式来收集它们joining()joinning()无参数方法会返回一个Collectors实例,并且以空字符串("
本章节我们提供一些Java8中的IntStream、LongStream和DoubleStream使用范例。IntStream、LongStream和DoubleStream分别表示原始int流、原始long流和原始double流。这三个原始流类提供了大量的方法用于操作流中的数据,同时提供了相应的静态方法来初始化它们自己。这三个原始流类都在java.util.stream命名空间下。java.util.stream.IntStreamjava.util.stream.IntStream是一个原始整数值序列(sequence)。该流提供了许多方法可以对该流中的元素顺序执行或并行执行一些聚合操作,
Java8流的新类java.util.stream.Collectors实现了java.util.stream.Collector接口,同时又提供了大量的方法对流(stream)的元素执行mapandreduce操作,或者统计操作。本章节,我们就来看看那些常用的方法,顺便写几个示例练练手。Collectors.averagingDouble()Collectors.averagingDouble()方法将流中的所有元素视为double类型并计算他们的平均值。该方法返回的是同一个Collectors实例,因此可以进行链式操作。Collectors.averagingDouble()接受一个参数,