JAVA8新特性总结及案例.doc

上传人:jian****018 文档编号:9613930 上传时间:2020-04-06 格式:DOC 页数:40 大小:1.65MB
返回 下载 相关 举报
JAVA8新特性总结及案例.doc_第1页
第1页 / 共40页
JAVA8新特性总结及案例.doc_第2页
第2页 / 共40页
JAVA8新特性总结及案例.doc_第3页
第3页 / 共40页
点击查看更多>>
资源描述
一 Lambda函数(箭头函数)Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。(parameters) - expression或(parameters) - statement1;statement2;. lambda表达式的重要特征:可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。可选的大括号:如果主体包含了一个语句,就不需要使用大括号。可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回,大括号需指定表达式返回数值。本质上,Lambda函数是对匿名内部类对象的简写。应用举例1(比较JAVA7与JAVA8):Lambda函数做类的属性运行结果:应用举例2(比较JAVA7与JAVA8):Lambda函数做main函数变量应用举例3:应用举例4:多线程启动时使用Lambda函数应用举例5:在1.7中,匿名内部类只能使用定义为final的外部变量,1.8会自动为Lambda函数使用的外部变量加上final,因此final可以省略不写。二 方法引用 (:方法名 -调用了方法对象)应用举例1:应用举例2:三 函数式接口函数式接口(Functional Interface)就是一个具有一个方法的普通接口。函数式接口可以被隐式转换为lambda表达式。函数式接口可以现有的函数友好地支持 lambda。JDK 1.8之前已有的函数式接口:java.lang.Runnablejava.util.concurrent.Callablejava.security.PrivilegedActionjava.util.Comparatorjava.io.FileFilterjava.nio.file.PathMatcherjava.lang.reflect.InvocationHandlerjava.beans.PropertyChangeListenerjava.awt.event.ActionListenerjavax.swing.event.ChangeListenerJDK 1.8 新增加的函数接口:java.util.functionjava.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有:序号接口 & 描述1BiConsumer代表了一个接受两个输入参数的操作,并且不返回任何结果2BiFunction代表了一个接受两个输入参数的方法,并且返回一个结果3BinaryOperator代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果4BiPredicate代表了一个两个参数的boolean值方法5BooleanSupplier代表了boolean值结果的提供方6Consumer代表了接受一个输入参数并且无返回的操作7DoubleBinaryOperator代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。8DoubleConsumer代表一个接受double值参数的操作,并且不返回结果。9DoubleFunction代表接受一个double值参数的方法,并且返回结果10DoublePredicate代表一个拥有double值参数的boolean值方法11DoubleSupplier代表一个double值结构的提供方12DoubleToIntFunction接受一个double类型输入,返回一个int类型结果。13DoubleToLongFunction接受一个double类型输入,返回一个long类型结果14DoubleUnaryOperator接受一个参数同为类型double,返回值类型也为double 。15Function接受一个输入参数,返回一个结果。16IntBinaryOperator接受两个参数同为类型int,返回值类型也为int 。17IntConsumer接受一个int类型的输入参数,无返回值 。18IntFunction接受一个int类型输入参数,返回一个结果 。19IntPredicate:接受一个int输入参数,返回一个布尔值的结果。20IntSupplier无参数,返回一个int类型结果。21IntToDoubleFunction接受一个int类型输入,返回一个double类型结果 。22IntToLongFunction接受一个int类型输入,返回一个long类型结果。23IntUnaryOperator接受一个参数同为类型int,返回值类型也为int 。24LongBinaryOperator接受两个参数同为类型long,返回值类型也为long。25LongConsumer接受一个long类型的输入参数,无返回值。26LongFunction接受一个long类型输入参数,返回一个结果。27LongPredicateR接受一个long输入参数,返回一个布尔值类型结果。28LongSupplier无参数,返回一个结果long类型的值。29LongToDoubleFunction接受一个long类型输入,返回一个double类型结果。30LongToIntFunction接受一个long类型输入,返回一个int类型结果。31LongUnaryOperator接受一个参数同为类型long,返回值类型也为long。32ObjDoubleConsumer接受一个object类型和一个double类型的输入参数,无返回值。33ObjIntConsumer接受一个object类型和一个int类型的输入参数,无返回值。34ObjLongConsumer接受一个object类型和一个long类型的输入参数,无返回值。35Predicate接受一个输入参数,返回一个布尔值结果。36Supplier无参数,返回一个结果。37ToDoubleBiFunction接受两个输入参数,返回一个double类型结果38ToDoubleFunction接受一个输入参数,返回一个double类型结果39ToIntBiFunction接受两个输入参数,返回一个int类型结果。40ToIntFunction接受一个输入参数,返回一个int类型结果。41ToLongBiFunction接受两个输入参数,返回一个long类型结果。42ToLongFunction接受一个输入参数,返回一个long类型结果。43UnaryOperator接受一个参数为类型T,返回值类型也为T。四 接口的默认方法默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。我们只需在方法名前面加个default关键字即可实现默认方法。为什么要有这个特性?1.8之前,修改接口意味着要修改全部实现该接口的类,例如,java 8之前的集合框架没有foreach方法,通常的解决办法是在JDK里给相关的接口添加新的方法及实现类。对于已经发布的版本,会影响已有的实现。接口引进了的默认方法的机制。最大化的解决了接口的修改与现有的实现不兼容的问题。需求变更,需要修改接口,此时使用java8新特性中的接口默认方法,实现类TestImpl无需改变代码,ITest接口即可提供服务。当然TestImpl也可以覆盖接口中的变更方法print五 JAVA8 StreamStream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提供Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等,最后由最终操作(terminal operation)得到前面处理的结果。+-+ +-+ +-+ +-+ +-+| stream of elements +- |filter+- |sorted+- |map+- |collect|+-+ +-+ +-+ +-+ +-+以上的流程转换为 Java 代码为:List transactionsIds = widgets.stream() .filter(b - b.getColor() = RED) .sorted(x,y) - x.getWeight() - y.getWeight() .mapToInt(Widget:getWeight) .sum();5.1生成流:在 Java 8 中, 集合接口有两个方法来生成流:stream() 为集合创建串行流。parallelStream() 为集合创建并行流。【串行与并行】5.2 forEach遍历方法5.3 map方法map用于映射每个元素到对应的运行结果5.4 filter、limit、sorted、parallelStreamfilter 方法用于通过设置的条件过滤出元素。limit 获取指定数量的流sorted 对流对象进行排序parallelStream 并行流替代串行流5.5 collect方法及Collectors类Collectors.toList方法 由流转变为List集合Collectors.joining(,)方法,由流转变为字符串5.6 IntSummaryStatistics统计收集器5.7 综合比较JAVA7与JAVA8package com.company.java8.stream;import java.util.ArrayList;import java.util.Arrays;import java.util.IntSummaryStatistics;import java.util.List;import java.util.Random;import java.util.stream.Collectors;public class Stream7 /Java7计算空字符串数量private static int getCountEmptyStringUsingJava7(List strings) int count = 0;for (String string : strings) if (string.isEmpty() count+;return count;/Java7计算长度为3的字符串数量private static int getCountLength3UsingJava7(List strings) int count = 0;for (String string : strings) if (string.length() = 3) count+;return count;/Java7将非空字符串整合成List集合private static List deleteEmptyStringsUsingJava7(List strings) List filteredList = new ArrayList();for (String string : strings) if (!string.isEmpty() filteredList.add(string);return filteredList;/Java7将非空字符串合并成指定分隔符的字符串private static String getMergedStringUsingJava7(List strings, String separator) StringBuilder stringBuilder = new StringBuilder();for (String string : strings) if (!string.isEmpty() stringBuilder.append(string);stringBuilder.append(separator);String mergedString = stringBuilder.toString();return mergedString.substring(0, mergedString.length() - 2);/Java7获取平方集合private static List getSquares(List numbers) List squaresList = new ArrayList();for (Integer number : numbers) Integer square = new Integer(number.intValue() * number.intValue();if (!squaresList.contains(square) squaresList.add(square);return squaresList;/Java7获取最大值private static int getMax(List numbers) int max = numbers.get(0);for (int i = 1; i max) max = number.intValue();return max;/Java7获取最小值private static int getMin(List numbers) int min = numbers.get(0);for (int i = 1; i numbers.size(); i+) Integer number = numbers.get(i);if (number.intValue() min) min = number.intValue();return min;/Java7获取总数private static int getSum(List numbers) int sum = (int) (numbers.get(0);for (int i = 1; i numbers.size(); i+) sum += (int) numbers.get(i);return sum;/Java7获取平均值private static int getAverage(List numbers) return getSum(numbers) / numbers.size();/主函数public static void main(String args) System.out.println(*);System.out.println(使用 Java 7: );/ 计算空字符串List strings = Arrays.asList(abc, , bc, efg, abcd, , jkl);System.out.println(列表: + strings);long count = getCountEmptyStringUsingJava7(strings);System.out.println(空字符数量为: + count);count = getCountLength3UsingJava7(strings);System.out.println(字符串长度为 3 的数量为: + count);/ 删除空字符串List filtered = deleteEmptyStringsUsingJava7(strings);System.out.println(筛选后的列表: + filtered);/ 删除空字符串,并使用逗号把它们合并起来String mergedString = getMergedStringUsingJava7(strings, , );System.out.println(合并字符串: + mergedString);List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);/ 获取列表元素平方数List squaresList = getSquares(numbers);System.out.println(平方数列表: + squaresList);List integers = Arrays.asList(1, 2, 13, 4, 15, 6, 17, 8, 19);System.out.println(列表: + integers);System.out.println(列表中最大的数 : + getMax(integers);System.out.println(列表中最小的数 : + getMin(integers);System.out.println(所有数之和 : + getSum(integers);System.out.println(平均数 : + getAverage(integers);System.out.println(随机数: );/ 输出10个随机数Random random = new Random();for (int i = 0; i string.isEmpty().count();System.out.println(空字符串数量为: + count);count = strings.stream().filter(string - string.length() = 3).count();System.out.println(字符串长度为 3 的数量为: + count);filtered = strings.stream().filter(string - !string.isEmpty().collect(Collectors.toList();System.out.println(筛选后的列表: + filtered);mergedString = strings.stream().filter(string - !string.isEmpty().collect(Collectors.joining(, );System.out.println(合并字符串: + mergedString);squaresList = numbers.stream().map(i - i * i).distinct().collect(Collectors.toList();System.out.println(Squares List: + squaresList);System.out.println(列表: + integers);IntSummaryStatistics stats = integers.stream().mapToInt(x) - x).summaryStatistics();System.out.println(列表中最大的数 : + stats.getMax();System.out.println(列表中最小的数 : + stats.getMin();System.out.println(所有数之和 : + stats.getSum();System.out.println(平均数 : + stats.getAverage();System.out.println(随机数: );random.ints().limit(10).sorted().forEach(System.out:println);/ 并行处理count = strings.parallelStream().filter(string - string.isEmpty().count();System.out.println(空字符串的数量为: + count);六 JAVA8 Optional类Optional 类是一个可以为null的容器对象,它可以保存类型T的值,或者仅仅保存null。如果值存在,则isPresent()方法会返回true,调用get()方法会返回该对象。这样我们就不用显式进行空值检测。Optional 类的引入很好的解决空指针异常。类声明以下是一个java.util.Optional类的声明:public final class Optional extends Object类方法序号方法 & 描述1static Optional empty()返回空的 Optional 实例。2boolean equals(Object obj)判断其他对象是否等于 Optional。3Optional filter(Predicate? super predicate)如果值存在,并且这个值匹配给定的 predicate,返回一个Optional用以描述这个值,否则返回一个空的Optional。4 Optional flatMap(Function? super T,Optional mapper)如果值存在,返回基于Optional包含的映射方法的值,否则返回一个空的Optional5T get()如果在这个Optional中包含这个值,返回值,否则抛出异常:NoSuchElementException6int hashCode()返回存在值的哈希码,如果值不存在 返回 0。7void ifPresent(Consumer consumer)如果值存在则使用该值调用 consumer , 否则不做任何事情。8boolean isPresent()如果值存在则方法会返回true,否则返回 false。9Optional map(Function mapper)如果存在该值,提供的映射方法,如果返回非null,返回一个Optional描述结果。10static Optional of(T value)返回一个指定非null值的Optional。11static Optional ofNullable(T value)如果为非空,返回 Optional 描述的指定值,否则返回空的 Optional。12T orElse(T other)如果存在该值,返回值, 否则返回 other。13T orElseGet(Supplier other)如果存在该值,返回值, 否则触发 other,并返回 other 调用的结果。14 T orElseThrow(Supplier exceptionSupplier)如果存在该值,返回包含的值,否则抛出由 Supplier 继承的异常15String toString()返回一个Optional的非空字符串,用来调试七 JAVA8 Nashorn引擎Nashorn是一个 javascript 引擎,从JDK 1.8开始,Nashorn取代Rhino(JDK 1.6, JDK1.7)成为Java的嵌入式JavaScript引擎。Nashorn完全支持ECMAScript 5.1规范以及一些扩展,可以将JavaScript编译成Java字节码,带来了2到10倍的性能提升。7.1 jjs命令行工具jjs是个基于Nashorn引擎的命令行工具。它接受一些JavaScript源代码为参数,并且执行这些源代码。/print语句,浏览器执行就是直接调打印程序,控制台执行就是在控制台显示信息7.2 JAVA调用Javascript程序使用 ScriptEngineManager, JavaScript 代码可以在 Java 中执行.7.3 Javascript调用JAVA程序八 JAVA8 日期时间APIJava 8通过发布新的Date-Time API 来进一步加强对日期与时间的处理。在 Java7之前的版本中,日期时间 API 存在的问题如下:非线程安全 java.util.Date 是异步的,非线程安全的,这是Java日期类最大的问题之一。设计很差 Java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。时区处理麻烦 日期类并不提供国际化,没有时区支持,因此Java引入了java.util.Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。Java 8 在java.time包下提供了很多新的 API。以下为两个比较重要的 API:Local(本地) 简化了日期时间的处理,没有时区的问题。Zoned(时区) 通过制定的时区处理日期时间。Java8中新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。8.1 本地化日期时间APIpackage com.company.java8.time;import java.time.LocalDate;import java.time.LocalDateTime;import java.time.LocalTime;import java.time.Month;public class LocalTimeDemo public static void main(String args) LocalTimeDemo lt = new LocalTimeDemo();lt.testLocalDateTime();public void testLocalDateTime() / 获取当前的日期时间LocalDateTime currentTime = LocalDateTime.now();System.out.println(当前时间: + currentTime);LocalDate date1 = currentTime.toLocalDate();System.out.println(date1: + date1);Month month = currentTime.getMonth();int day = currentTime.getDayOfMonth();int seconds = currentTime.getSecond();System.out.println(月: + month + , 日: + day + , 秒: + seconds);LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012);System.out.println(date2: + date2);/ 12 december 2014LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);System.out.println(date3: + date3);/ 22 小时 15 分钟LocalTime date4 = LocalTime.of(22, 15);System.out.println(date4: + date4);/ 解析字符串LocalTime date5 = LocalTime.parse(20:15:30);System.out.println(date5: + date5);8.2 使用时区的时间API九 JAVA8 Base64Java 8 内置了 Base64 编码的编码器和解码器。Base64工具类提供了一套静态方法获取下面三种BASE64编解码器:基本:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何行标,输出的解码仅支持A-Za-z0-9+/。URL:输出映射到一组字符A-Za-z0-9+_,输出是URL和文件。MIME:输出隐射到MIME友好格式。输出每行不超过76字符,并且使用r并跟随n作为分割。编码输出最后没有行分割。内嵌类序号内嵌类 & 描述1static class Base64.Decoder该类实现一个解码器用于,使用 Base64 编码来解码字节数据。2static class Base64.Encoder该类实现一个编码器,使用 Base64 编码来编码字节数据。方法序号方法名 & 描述1static Base64.Decoder getDecoder()返回一个 Base64.Decoder ,解码使用基本型 base64 编码方案。2static Base64.Encoder getEncoder()返回一个 Base64.Encoder ,编码使用基本型 base64 编码方案。3static Base64.Decoder getMimeDecoder()返回一个 Base64.Decoder ,解码使用 MIME 型 base64 编码方案。4static Base64.Encoder getMimeEncoder()返回一个 Base64.Encoder ,编码使用 MIME 型 base64 编码方案。5static Base64.Encoder getMimeEncoder(int lineLength, byte lineSeparator)返回一个 Base64.Encoder ,编码使用 MIME 型 base64 编码方案,可以通过参数指定每行的长度及行的分隔符。6static Base64.Decoder getUrlDecoder()返回一个 Base64.Decoder ,解码使用 URL 和文件名安全型 base64 编码方案。7static Base64.Encoder getUrlEncoder()返回一个 Base64.Encoder ,编码使用 URL 和文件名安全型 base64 编码方案。MIME type的缩写为(Multipurpose Internet Mail Extensions)代表互联网媒体类型(Internet media type),MIME使用一个简单的字符串组成,最初是为了标识邮件Email附件的类型,在html文件中可以使用content-type属性表示,描述了文件类型的互联网标准。MIME类型能包含视频、图像、文本、音频、应用程序等数据。package com.company.java8.base64;import java.io.UnsupportedEncodingException;import java.util.Base64;import java.util.UUID;public class Base64Demo public static void main(String args) try / 使用基本编码String base64encodedString = Base64.getEncoder().encodeToString(Hello JAVA8!.getBytes(utf-8);System.out.println(Base64 处理后的字符串 : + base64encodedString);/ 基本解码byte base64decodedBytes = Base64.getDecoder().decode(base64encodedString);System.out.println(解码后的原始字符串: + new String(base64decodedBytes, utf-8);/ URL编码base64encodedString = Base64.getUrlEncoder().encodeToString(Hello World with JAVA8!.getBytes(utf-8);System.out.println(Base64 编码字符串 (URL) :rn + base64encodedString);/MIME编码StringBuilder stringBuilder = new StringBuilder();for (int i = 0; i 10; +i) stringBuilder.append(UUID.randomUUID().toString()+rn);System.out.println(stringBuilder.toString();byte mimeBytes = stringBuilder.toString().getBytes(utf-8);String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);System.out.println(Base64 编码字符串 (MIME) :rn + mimeEncodedString); catch (UnsupportedEncodingException e) System.out.println(Error : + e.getMessage();
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!