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

news2024/11/26 1:44:25

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
  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。

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 Stream

Optional

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

具体来说Optional是用来对java 对象判空用的,把一个对象存储到Optional中,Optional对象提供了众多方法对容器里的对象处理和判断,其判空功能减少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 对象.

  • 使用

在这里插入图片描述
在这里插入图片描述
Optional提供了众多方法对其元素处理,更多方法请移步干货,一文彻底搞懂 Java 的 Optional

Optional API

Optional判空

在这里插入图片描述

    @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);
    }

在这里插入图片描述

Optional取值

@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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/377531.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构与算法——4时间复杂度分析2(常见的大O阶)

这篇文章是时间复杂度分析的第二篇。在前一篇文章中&#xff0c;我们从0推导出了为什么要用时间复杂度&#xff0c;时间复杂度如何分析以及时间复杂度的表示三部分内容。这篇文章&#xff0c;是对一些常用的时间复杂度进行一个总结&#xff0c;相当于是一个小结论 1.常见的大O…

ESFP型人格的特征,ESFP型人格的优势和劣势分析

ESFP型人格的特征ESFP&#xff08;表演者型人格&#xff09;是人群中的开心果。他们外向&#xff0c;友善&#xff0c;包容&#xff0c;有他们在的地方总是充满着活泼的氛围。ESFP对于新的朋友&#xff0c;新的环境适应良好&#xff0c;他们是完完全全的社交动物&#xff0c;对…

【数据库原理 | MySQL】一文打通 DDL语句

&#x1f935;‍♂️ 个人主页: 计算机魔术师 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 书接上文介绍了数据库的前世今生&#xff0c;本文讲解SQL语句中的DDL语句 文章目录二、SQL2.1 SQL通用语法2.2 SQL的分类三、 …

I.MX6ULL_Linux_系统篇(19) kernel编译及Makefile分析

Linux 内核 Linux 由 Linux 基金会管理与发布&#xff0c; Linux 官网为 https://www.kernel.org&#xff0c;所以你想获取最新的Linux 版本就可以在这个网站上下载&#xff0c;网站界面如图所示&#xff1a; 从图中可以看出最新的稳定版 Linux 已经到了 6.2&#xff0c;NXP …

Python常用标准库-sys库一文详解

目录 前言 一、Sys库概述 二、Sys查看版本信息 1.sys.version获取Python版本信息 2.sys.api_version获取解释器中C的API版本 3.sys.getwindowsversion系统功能版本 4.sys.hexversion()获取Python解释器的版本值 5.sys.implementation获取当前正在运行的Python解释器的实现…

Redis源码---如何实现一个性能优异的Hash表

目录 前言 Redis 如何实现链式哈希&#xff1f; 什么是哈希冲突&#xff1f; 链式哈希如何设计与实现&#xff1f; Redis 如何实现 rehash&#xff1f; 什么时候触发 rehash&#xff1f; rehash 扩容扩多大&#xff1f; 渐进式 rehash 如何实现&#xff1f; 前言 Hash …

数据处理 |遍历所有文件夹及子目录文件夹方法总结与实例代码详解

深度学习中不可避免的数据预处理~1. glob.glob()方法 2. pathlib中的Path方法3. os.walk()方法1. glob.glob()方法 语法glob.glob(pathname)&#xff08;多指定文件类型&#xff0c;查找jpg,png,txt,json等&#xff09;缺点&#xff1a;查找文件较慢2. 路径操作库pathlib中的Pa…

【计算机三级网络技术】 第四篇 路由设计技术基础

文章目录一、分组转发二、路由选择1.理想的路由算法的基本特征2.路由算法的度量标准3.路由算法分类&#xff1a;4.IP路由选择与路由汇聚(重点)三、自治系统与Internet的路由选择协议1.自治系统2.路由选择协议的分类四、内部网关协议1.RIP的基本概念2.RIP的原理3.RIP的运行过程五…

Android Lmkd 低内存终止守护程序

一、低内存终止守护程序 Android 低内存终止守护程序 (lmkd) 进程可监控运行中的 Android 系统的内存状态&#xff0c;并通过终止最不必要的进程来应对内存压力大的问题&#xff0c;使系统以可接受的性能水平运行。 所有应用进程都是从zygote孵化出来的&#xff0c;记录在AMS…

Android问题笔记 - 打开Android Studio先弹出项目选择框

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断…

leetcode 427. Construct Quad Tree(构建四叉树)

刚看到题的时候是懵的&#xff0c;这也太长了。到底是要表达什么呢。 不妨把这个矩阵看成一个正方形的图片&#xff0c;想象你在处理图片&#xff0c;从整体逐步到局部。 刚开始看一整张图片&#xff0c;如果是全0或全1&#xff0c;这个就是叶子节点&#xff0c;怎么表达叶子节…

网络货运平台“降本提质引流增值”秘籍是什么?

2月24日&#xff0c;2022&#xff08;第五届&#xff09;中国网络货运平台年会在厦门举行&#xff0c;数据宝作为中物联副会长单位受邀参加峰会&#xff0c;数据宝轮值CEO肖斌发表题为“网络货运平台数字化创新应用实践分享”的主题分享。 据交通运输部统计&#xff0c;截止到2…

某建筑设计研究院“综合布线管理软件”应用实践

某建筑设计研究院有限公司&#xff08;简称“某院”&#xff09;隶属于国务院国资委直属的大型骨干科技型中央企业。“某院”前身为中央直属设计公司&#xff0c;创建于1952年。成立近70年来&#xff0c;始终秉承优良传统&#xff0c;致力于推进国内勘察设计产业的创新发展&…

CASENet中edge GT是如何产生的

1&#xff1a;首先下载cityscape数据集&#xff0c;包含两个大文件夹&#xff0c;具体的数据集介绍参考此链接。cityscape数据集解析 看一下gtFine子文件夹&#xff0c;另一个也是同理&#xff1a; 2&#xff1a;将下载好的数据集放到data_orig中&#xff0c;还有一个文件…

报错记录:element-admin框架打包后静态文件加载异常与登录异常解决方案

报错记录&#xff1a;element-admin框架打包后静态文件加载异常与登录异常解决方案 一、静态文件加载异常解决方案 二、登录异常解决方案 现象 element-admin如果用 electron 打包 是会有个问题&#xff1a; electron serve 运行没问题 electron build 打release 包 就会出错…

AST之path常用属性和方法总结笔记

文章目录1. path常用属性总结1.1 path.node1.2 path.scope1.3 path.parentPath1.4 path.parent1.5 path.container1.6 path.type1.7 path.key2. path常用方法总结2.1 path.toString2.2 path.replaceWith2.3 path.replaceWithMultiple2.4 path.remove2.5 path.insertBefore2.6 p…

TypeScript 常用知识

「 推荐一个学习 ts 基础的专栏&#xff0c;满满的干货&#xff1a;typeScript 」 1、为什么推荐使用 TypeScript 【】ts 是 js 的超集&#xff0c;包含 js 的所有元素 【】ts 通过对代码进行类型检查&#xff0c;可以帮助我们避免在编写 js 时经常遇到令人痛苦的错误 【】强…

第六节 方法

方法 方法是一种语法结构。 方法的作用&#xff1a; 1.提高代码的复用性 2.让程序逻辑更加清晰 方法定义的完整格式&#xff1a; 修饰符 返回值类型 方法名&#xff08;形参列表&#xff09;{ 方法体的代码&#xff08;需要执行的功能代码&#xff09; return 返回值&#xff…

Unity性能优化: 性能优化之内存篇

前言 本文和传统的内存优化不一样&#xff0c;不是讲如何降低内存占用&#xff0c;而是讲编程开发中要注意的内存问题以及一些内存技术的演变与原理。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流一下开发经验呀 1: Application进程…

maven项目无法解析插件

发现问题使用IDEA创建Maven项目时&#xff0c;报错无法解析插件 org.apache.maven.plugins:maven-clean-plugin这里使用的是IDEA捆绑的Maven插件解决方案查看Maven配置打开用户设置文件settings.xml&#xff0c;在其中加入如果该路径下没有此文件&#xff0c;可以自己创建一个。…