小工具      在线工具  汉语词典  css  js  c++  java

JDK8常用新特性的原理与代码演示

Java,java 额外说明

收录于:158天前

Lambda

Lambda表达式,也称为闭包,Lambda允许将函数用作方法的参数。

  1. 格式
    (参数列表) -> {代码块}
(parameters) -> expression
或
(parameters) ->{
     statements; }
  1. 前提条件

lambda 表达式是执行特定功能并需要被相应对象接受的代码块。使用lambda表达式的前提是作为参数的对象必须是一个接口,并且该接口必须有且仅有一个不可重写的抽象方法。 。

  1. lambda表达式的作用是简化一些接口上实现类方法的过程,减少代码量。

从前置条件可以得出,当接口只有一个抽象方法时,直接使用lambda表达式特别方便,并且可以用任意函数实现函数。

public class LambdaTest {
    
    public static void main(String[] args) {
    
        int a=1,b =2;
        //通过已知类访问
        Sum sum  = new Sum();
        int sum1 = sum.sum(a, b);
        //匿名内部类

        new Sum().sum(a, b);
        Delete del = (a1,b1)->{
     return a1-b1;};
        System.out.println(del.delete(b,a));

    }
}

//抽象类
class Sum{
    
    private int a;
    private int b;
    public int sum(int a,int b){
    
        return a+b;
    }
}

//接口
interface Delete{
    
    public int delete(int a,int b);
}

在这里插入图片描述
通过上面案例可看出lambda表达式直接实现了减法的功能省去了接口的继承方法重写的步骤。

  1. 功能接口
public interface LambdaFctory<T> {
    
    //有返回值类型

    T funcAny(T elem[]);
}


public class Test2{
    
    public static void main(String[] args) {
    

        LambdaFctory lambdaFctory = ( Object b[])->{
     return (int)b[0]+(int)b[1];};

        Object[] obj = new Object[] {
    1,2,3};

        System.out.println(lambdaFctory.funcAny(obj));
    }
}

在这里插入图片描述

public interface UnitFactory {
    
    public void funcUnit(ArrayList list);
}


public class Test3 {
    
    public static void main(String[] args) {
    
        UnitFactory unitFactory = (ArrayList list) ->{
    
            for (Object obj:list){
    
                System.out.println(obj);
            }
        };
        
        ArrayList list = new ArrayList(Arrays.asList(1,2,3,4,5,6));
        
        unitFactory.funcUnit(list);
    }
}

在这里插入图片描述
5. labmda作为函数函数参数

Lambda 作为参数传递,类型必须是接口,并且必须满足使用 lambda 的前提条件。

在这里插入图片描述
在这里插入图片描述
如上图所示lambda返回值类型为一个接口。

public class Test5 {
    
    public static void main(String[] args) {
    
        //函数接口编程
        LambdaT5 lambdaT5 = (String s) -> {
    
            System.out.println(s);
        };
        //lambda参数传递
        Abstract5 abstract5 =new Abstract5();
        abstract5.AbstractPrint( (String s) -> System.out.println(s));
        String str = "测试";

        abstract5.AbstractPrint( (s) -> System.out.println(str));




    }
}

interface LambdaT5{
    
    void print(String s);
}

class Abstract5{
    
    void AbstractPrint(LambdaT5 lambdaT5){
    
        lambdaT5.print("抽象类调用了接口方法");
    }
}

在这里插入图片描述
在上面案例中,抽象类的参数为函数接口,因此在使用抽象类是直接将lambda表达式作为参数传递。需要注意的是在labmda传递变量时,需要再抽象类中传递。

lambda 表达式的重要特征:

  • 首先类型必须是接口interface
  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选参数括号:一个参数不需要用括号定义,但多个参数需要用括号定义。
  • 可选大括号:如果正文包含语句,则不需要大括号。
  • 可选的return关键字:如果body只有一个表达式返回值,编译器将自动返回该值。大括号需要指定表达式返回一个值。

lambda学习网站

Stream

Java 8 API有一个新的抽象称为Stream——流,用一种声明的方式处理数据。Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

Java Stream 对集合执行过滤、排序和对象转换等操作。 Java中的Stream并不存储元素,而是按需计算和处理元素。

流的来源:可以是集合,数组,I/O channel, 产生器generator 等。
行动操作: 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
转化操作:将流转换为java集合。

JDK8

生成流

  • stream()——为集合创建串行流。

  • parallelStream()——为集合创建并行流。

在这里插入图片描述

热门动作
Stream的集合操作有:filter, map, reduce, find, match, sorted等

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

记住Stream的主要功能,需要的时候查看手册即可。

在这里插入图片描述
JDK8中文开发手册

Java8中Stream的详细使用

Java 8 流

Optional

Optional 类是一个可以为 null 的容器对象。 Optional 是一个容器,可以保存 T 类型的值(一个值),或者只是 null。 Optional 提供了许多有用的方法,这样我们就不必显式地检测空值。 Optional类的引入很好的解决了空指针异常。

具体来说,Optional用于判断Java对象的null值。一个对象存储在Optional中。 Optional对象提供了很多方法来处理和确定容器中的对象。它的 null 确定功能减少了 java.lang.NullPointerException 错误的数量。出现。

进入Optional源码可以看到该对象使用final关键字修饰

在这里插入图片描述

final修饰的对象不可更改,不能继承。Optional需要携带泛型Optional<Object> empty = Optional.empty()

  • 创造

在这里插入图片描述

如上图所示,Optional对象提供了三种创建对象的方法:

(1) 使用静态方法 empty() 创建一个空的 Optional 对象;
(2) 使用静态方法 of() 创建一个非空的 Optional 对象;
(3) 使用静态方法 ofNullable() 创建一个即可空又可非空的 Optional 对象。

ofNullable() 方法内部有一个三元表达式。如果参数为null,则返回私有常量EMPTY;否则,使用 new 关键字创建一个新的可选对象。

  • 使用

在这里插入图片描述
在这里插入图片描述
Optional提供了众多方法对其元素处理,更多方法请移步好东西,一篇文章彻底理解Java的Optional

可选API

可选空

在这里插入图片描述

    @Test
    public void method(){
    
        String str = "hello Optional";
        Optional<String> str1 = Optional.of(str);
        //非空判断
        boolean empty = str1.isEmpty();
        System.out.println(empty);
		//容器判断,空返回false,否则返回true
        boolean present = str1.isPresent();
        System.out.println(present);
    }

在这里插入图片描述

可选值

@Test
public void method3(){
    
    String str = "hello Optional";
    Optional<String> container = Optional.of(str);
    String s = container.get();
    System.out.println(s);

}

在这里插入图片描述

时间处理

  • 旧时处理

java.util.Date

@Test
public void method1(){
    
    Date date = new Date();
    System.out.println(date);
}
/* Tue Feb 28 16:00:28 CST 2023 */

在这里插入图片描述

java.sql.Date继承于java.util.Date只用于记录当前时间

 @Test
 public void method2(){
    
     long time = System.currentTimeMillis();
     java.sql.Date date = new java.sql.Date(time);
     System.out.println(date);
 }
/* 2023-02-28 */

默认的时间格式无法满足日常需要。需要使用以下两个类来转换格式。

java.text.DateFormat;
java.text.SimpleDateFormat
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Test1 {
    

    public static void main(String[] args) {
    
        //初始格式
        Date date1 = new Date();
        System.out.println(date1);

        //规范日期
        DateFormat date = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.CHINA);

        //规范时间
        DateFormat time = DateFormat.getTimeInstance(DateFormat.MEDIUM, Locale.CHINA);

        //格式化日期
        String str = date.format(date1);
        //格式化时间
        String str1 = time.format(date1);

        String strdate = str+" "+str1;
        System.out.println(strdate);

        /* Tue Feb 28 15:45:14 CST 2023 2023年2月28日 下午3:45:14 */


        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(dateFormat.format(new Date()));

    }
}

在这里插入图片描述

SimpleDateFormat(String pattern):用指定的格式来返回时间字符,能自动识别下面的字符:

在这里插入图片描述
更多请看Java 日期格式化(DateFormat 类和 SimpleDateFormat 类)

  • 新时间处理

新的时间包位于java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻等操作。

Java对时间的处理

BASE64

Java8 Base64

一般用于将图片存储在数据库中,建议直接存储在文件夹中。

. . .

相关推荐

额外说明

[Java|多线程与高并发]中断线程的两种方法

文章目录 1.前言 2. 方法1: 自定义标志位 3. 方法2:使用标准库自带的标志位 4.总结 1.前言 线程中断是指在一个线程执行的过程中,强制终止该线程的执行。虽说是中断,但本质上是让run方法快点执行完,而不是run方法执行到一半,强制结束. 本

额外说明

day12---(08)注册接口

1、service模块下创建子模块service_ucenter 2、创建用户数据库 3、用代码生成器生成代码 4、编写配置文件 # 服务端口 server.port=8006 # 服务名 spring.application.name=service-

额外说明

Unity 热更新技术 |(七)完整热更新实战案例学习使用,包括资源热更新及代码热更新【文末书】

- 博客主页:https://xiaoy.blog.csdn.net - 本文由 呆呆敲代码的小Y 原创,首发于 CSDN- - 学习专栏推荐:Unity系统学习专栏 - 游戏制作专栏推荐:游戏制作 -Unity实战100例专栏推荐:Unity 实战10

额外说明

C语言刷题(9)

第一题  第一考察逗号表达式,实际应分为三个语句看分别是 int a[12]={....} int *p[4] int i 那么就可以知道p是一个整形指针 再就是  第二题   第三题    第四题  考察字符的本质是ASCII码值 第五题  容易认为x

额外说明

Direct3D 12——纹理——纹理

纹理不同于缓冲区资源,因为缓冲区资源仅存储数据数组,而纹理却可以具有多个mipmap层级(后 文有介绍),GPU会基于这个层级进行相应的特殊操作,例如运用过滤器以及多重采样。支持这些特殊 的操作纹理资源都被限定为一些特定的数据格式。而缓冲区资源就没有这项

额外说明

数据大帝国:大数据与人工智能的巅峰融合

文章目录 大数据与人工智能:概念解析 大数据与人工智能的融合 1. 数据驱动的决策 2. 自然语言处理(NLP) 3. 图像识别与计算机视觉 4. 智能推荐系统 5. 医疗诊断和生命科学 数据大帝国的未来展望 1. 智能城市 2. 区块链和数据安全 3.

额外说明

【Python 千题 —— 基础篇】字符串长度

题目描述 题目描述 获取字符串长度是编程过程中常用的操作之一。编写一个程序,输入一个字符串,然后输出字符串的长度。 输入描述 输入一个字符串。 输出描述 程序将输入的字符串的长度输出。 示例 示例 ① Apple 输出: 5 代码讲解 下面是本题的代

额外说明

SpringBoot之拦截器

文章目录 前言 一、编写拦截器 二、拦截器的执行时机和原理 总结 前言 SpringBoot拦截器讲解。 一、编写拦截器 编写一个拦截器实现HandlerInterceptor接口 拦截器注册到容器中(实现WebMvcConfigurer的addInte

额外说明

解决Android Studio无法连接网络获取SDK

** 解决Android Studio无法连接网络获取SDK ** 试过了很多方法都不可以,最后采取的是修改host文件: 前往 C:\Windows\System32\drivers\etc\hosts 复制hosts出来,在最后一行加上: 203.2

额外说明

DB2 SEQUENCE 序列的问题

最近数据库迁移,菜单插入系统报错! During SQL processing it returned:SQL0204N "ZX.SEQ_USYS" is an undefined name. SQLSTATE=42704 原因:    表里面插入数据的

ads via 小工具