首页 > 其他分享 >JDK1.8 新特性

JDK1.8 新特性

时间:2023-07-16 15:35:05浏览次数:28  
标签:JDK1.8 out System 特性 println stringCollection Optional Lambda

JDK1.8 都有哪些新特性?

JDK1.8 有不少新特性,我们经常接触到的新特性如下:

 

JDK1.8主要新特性

                                                                          JDK1.8主要新特性

  • 接口默认方法:Java 8 允许我们给接口添加一个非抽象的方法实现,只需要使用 default 关键字修饰即可

  • Lambda 表达式和函数式接口:Lambda 表达式本质上是一段匿名内部类,也可以是一段可以传递的代码。Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中),使用 Lambda 表达式使代码更加简洁,但是也不要滥用,否则会有可读性等问题,《Effective Java》作者 Josh Bloch 建议使用 Lambda 表达式最好不要超过 3 行。

  • Stream API:用函数式编程方式在集合类上进行复杂操作的工具,配合 Lambda 表达式可以方便的对集合进行处理。

    Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用 Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。

    简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

  • 日期时间 API:Java 8 引入了新的日期时间 API 改进了日期时间的管理。

  • Optional 类:用来解决空指针异常的问题。很久以前 Google Guava 项目引入了 Optional 作为解决空指针异常的一种方式,不赞成代码被 null 检查的代码污染,期望程序员写整洁的代码。受 Google Guava 的鼓励,Optional 现在是 Java 8 库的一部分。

Lambda 表达式了解多少?

Lambda 表达式本质上是一段匿名内部类,也可以是一段可以传递的代码。

比如我们以前使用 Runnable 创建并运行线程:

new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("Thread is running before Java8!");
            }
        }).start();
 

这是通过内部类的方式来重写 run 方法,使用 Lambda 表达式,还可以更加简洁:

 

当然不是每个接口都可以缩写成 Lambda 表达式。只有那些函数式接口(Functional Interface)才能缩写成 Lambda 表示式。

所谓函数式接口(Functional Interface)就是只包含一个抽象方法的声明。针对该接口类型的所有 Lambda 表达式都会与这个抽象方法匹配。

Java8 有哪些内置函数式接口?

JDK 1.8 API 包含了很多内置的函数式接口。其中就包括我们在老版本中经常见到的 Comparator 和 Runnable,Java 8 为他们都添加了 @FunctionalInterface 注解,以用来支持 Lambda 表达式。

除了这两个之外,还有 Callable、Predicate、Function、Supplier、Consumer 等等。

Optional 了解吗?

Optional是用于防范NullPointerException

可以将 Optional 看做是包装对象(可能是 null, 也有可能非 null)的容器。当我们定义了 一个方法,这个方法返回的对象可能是空,也有可能非空的时候,我们就可以考虑用 Optional 来包装它,这也是在 Java 8 被推荐使用的做法。

Optional<String> optional = Optional.of("bam");

optional.isPresent();           // true
optional.get();                 // "bam"
optional.orElse("fallback");    // "bam"

optional.ifPresent((s) -> System.out.println(s.charAt(0)));     // "b"
 

Stream 流用过吗?

Stream 流,简单来说,使用 java.util.Stream 对一个包含一个或多个元素的集合做各种操作。这些操作可能是 中间操作 亦或是 终端操作。 终端操作会返回一个结果,而中间操作会返回一个 Stream 流。

Stream 流一般用于集合,我们对一个集合做几个常见操作:

List<String> stringCollection = new ArrayList<>();
stringCollection.add("ddd2");
stringCollection.add("aaa2");
stringCollection.add("bbb1");
stringCollection.add("aaa1");
stringCollection.add("bbb3");
stringCollection.add("ccc");
stringCollection.add("bbb2");
stringCollection.add("ddd1");
 
  • Filter 过滤
stringCollection
    .stream()
    .filter((s) -> s.startsWith("a"))
    .forEach(System.out::println);

// "aaa2", "aaa1"

 
  • Sorted 排序
stringCollection
    .stream()
    .sorted()
    .filter((s) -> s.startsWith("a"))
    .forEach(System.out::println);

// "aaa1", "aaa2"
 
  • Map 转换
stringCollection
    .stream()
    .map(String::toUpperCase)
    .sorted((a, b) -> b.compareTo(a))
    .forEach(System.out::println);

// "DDD2", "DDD1", "CCC", "BBB3", "BBB2", "AAA2", "AAA1"
 
  • Match 匹配
// 验证 list 中 string 是否有以 a 开头的, 匹配到第一个,即返回 true
boolean anyStartsWithA =
    stringCollection
        .stream()
        .anyMatch((s) -> s.startsWith("a"));

System.out.println(anyStartsWithA);      // true

// 验证 list 中 string 是否都是以 a 开头的
boolean allStartsWithA =
    stringCollection
        .stream()
        .allMatch((s) -> s.startsWith("a"));

System.out.println(allStartsWithA);      // false

// 验证 list 中 string 是否都不是以 z 开头的,
boolean noneStartsWithZ =
    stringCollection
        .stream()
        .noneMatch((s) -> s.startsWith("z"));

System.out.println(noneStartsWithZ);      // true
 
  • Count 计数

count 是一个终端操作,它能够统计 stream 流中的元素总数,返回值是 long 类型。

// 先对 list 中字符串开头为 b 进行过滤,让后统计数量
long startsWithB =
    stringCollection
        .stream()
        .filter((s) -> s.startsWith("b"))
        .count();

System.out.println(startsWithB);    // 3
 
  • Reduce

Reduce 中文翻译为:减少、缩小。通过入参的 Function,我们能够将 list 归约成一个值。它的返回类型是 Optional 类型。

Optional<String> reduced =
    stringCollection
        .stream()
        .sorted()
        .reduce((s1, s2) -> s1 + "#" + s2);

reduced.ifPresent(System.out::println);
// "aaa1#aaa2#bbb1#bbb2#bbb3#ccc#ddd1#ddd2"
 

以上是常见的几种流式操作,还有其它的一些流式操作,可以帮助我们更便捷地处理集合数据。

 

Java Stream流

                                                                              Java Stream流

 

标签:JDK1.8,out,System,特性,println,stringCollection,Optional,Lambda
From: https://www.cnblogs.com/pxzbky/p/17557909.html

相关文章

  • -bash: /usr/local/src/jdk1.8/bin/java: /lib/ld-linux.so.2: bad ELF interpreter:
    在linux中安装jdk后,配置环境变量后,执行java-version命令后出现-bash:/usr/local/src/jdk1.8/bin/java:/lib/ld-linux.so.2:badELFinterpreter:Nosuchfileordirectory解决方案:sudoyuminstallglibc.i686安装完成后就可以啦......
  • JDK有用的新特性-Switch
    目录箭头表达式,新的case标签yeild返回值JavaRecordSwitch的三个方面,参考:JEP361支持箭头表达式支持yied返回值支持JavaRecord箭头表达式,新的case标签Switch新的语法,caselabel->表达式|throw语句|blockcaselabel_1,label_2,...,label_n->expressio......
  • JDK有用的新特性-Java Record
    目录JavaRecordRecord使用InstanceMethods静态方法StaticMethodRecord的构造方法step1:紧凑和定制构造方法Record与与LombokRecord实现接口LocalRecord嵌套Recordinstanceof判断Record类型总结JavaRecordJava14中预览的新特性叫做Record,在Java中,Record是一......
  • jdk1.8 的的安装和配置
    软件包下载链接:https://pan.baidu.com/s/1KNdKTtesoVhpmVsoXaz-dg提取码:54qe--来自百度网盘超级会员V6的分享1、打开运行软件 2、安装引导下一步 3、默认安装在c盘符,比较小,占不了多少空间 4、jre的安装路径 5、安装结束 6、找到安装路径,将路径存放在记事本中,以......
  • 从零玩转系列之SpringBoot3-基础特性
    一、简介1.前置知识​ ●Java17​ ●Spring、SpringMVC、MyBatis​ ●Maven、IDEA2.环境要求环境&工具版本(orlater)SpringBoot3.1.xIDEA2023.xJava17+Maven3.5+Tomcat10.0+Servlet5.0+GraalVMCommunity22.3+NativeBuildTools0......
  • ble开发 蓝牙服务中对服务、特性、属性以及UUID的理解
    1.蓝牙服务包括多个服务(service),如下为蓝牙串口通信例程的三个服务 2.其中每个服务包括多个特性(Characteristic),如下为GenericAccess服务的四个特性 3.属性即为每个特性是否可读写 4.每个特性都有其对应的UUID简单理解UUID就是编号,服务和特性都有各自的UUID他们都是唯一......
  • 现代C++(Modern C++)基本用法实践:N、其他零散的常用特性
    概述这一篇简单介绍一些其他的比较实用的特性,如果读者想了解现代C++的全部特性,参考:cppreference其他特性预置和弃置函数default&delete在C++11中引入了default和delete关键字,允许程序员更加明确地控制类的默认操作(如默认构造函数,拷贝构造函数,拷贝赋值运算符,析构函数等)......
  • Confidential Containers发布0.5.0版本,龙蜥将基于八大特性构建开箱即用的机密容器解决
    文/段勇帅01前言机密容器(ConfidentialContainers,简称CoCo)是CloudNativeComputingFoundation(CNCF)Sandbox项目。目前机密容器项目的核心参与者包括阿里云、AMD、ARM、IBM、Intel、Microsoft、RedHat、Rivos等软件和硬件公司。本次发布的CoCo-0.5.0release是机密容器社......
  • Java8新特性之parallelStream详解
    一、什么是流?Stream是java8中新增加的一个特性,首先Stream不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的Iterator。原始版本的Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的Stream,用户只要给出需要对其包含的元素......
  • Dubbo的高级特性:服务治理篇
    王有志,一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群:共同富裕的Java人上一篇中,我们已经在SpringBoot应用中集成了Dubbo,并注册了一个服务提供方和一个服务使用方。当然,生产环境中应用往往会部署多个节点,以此来保证服务的高可用,那么如何配置Dubbo的负载均衡策略呢?......