Java第十五天(实训学习整理资料(十四)Java8中的常用新特性)

news2024/11/17 4:14:08

目录

一、Lambda表达式

特点:

二、函数式接口

1、特点:

2、函数式接口分类

三、方法引用和构造引用

1、方法引用

2、构造引用

四、Stream(流) API

1、定义

2、特点

3、流处理中的持续执行(中间方法)和终止方法

4、如何将数据集转化为Stream

五、接口中的默认方法和静态方法

六、日期时间API

七、OPtional(重要)

1、定义

2、常用方法

八、反射

1、定义

2、反射中所涉及的类

3、获取class的三种方式


一、Lambda表达式

        lambda表达式就是匿名函数,匿名函数可以作为参数传递,表示数据。目的是让代码更加简洁,开发更高效!

        (参数1,参数2...)->{函数体}

特点:

        * 参数的类型可以不写,lambda表达式可以根据上下文进行推断
        * 函数体如果只有一行代码,大括号可以不写。
        * 如果只有一行代码并且是作为返回值使用,则return也可以不写
        * lambda表达式与函数式接口绑定出现

案例1:利用lambda表达式改写Thread线程对象构建

//lambda表达式
        Thread thread = new Thread(() -> {
            System.out.println("倒数:3");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("倒数:2");
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("倒数:1");
        });
        thread.start();

案例2:参数根据上下文自动推算

//参数x和y的类型进行了自动推算
        MyLambdaTest myLambdaTest = (x, y)->x+y;    //()->{return x+y;}

		interface MyLambdaTest{
			default void printName(){
				System.out.println(this.getClass().getName());
			}

			int sum(int a, int b);
		}

二、函数式接口

1、特点:

        只包含一个抽象方法的接口就是函数式接口。

        如果需要将接口设置为函数式接口,可以在接口上添加注解:

        @FunctionalInterface

2、函数式接口分类

jdk内置的函数式接口:

        java.util.function:(Function、Consumer、Supplier、Predicate)

函数型接口:有输入参数,也有返回值。Function

案例:

Function<String, Integer> fumc = (x)->x.length();

    Integer nihao = fumc.apply("nihao");
    System.out.println(nihao);

消费型接口:有参数,没有返回值。Consumer

供给型接口:没有参数,有返回值。Supplier

断言型接口:有输入参数,也有返回值,返回boolean类型。Predicate

补充案例:java支持不定长参数

public static void nums(int ... n){
			//System.out.println(n instanceof int[]);
			int sum = 0;
			for (int num:n) {
				sum+=num;
			}
			System.out.println("所有数值的总和是:"+sum);
		}

三、方法引用和构造引用

1、方法引用

        当要传递给Lambda体的操作已经有实现方法,可以直接使用方法引用

        写法:

        对象/类::方法名 //仅仅是引用但不执行

案例:

lambda:
		Consumer<String> consumer = (x)-> System.out.println(x);
        consumer.accept("hello world");

        lambda+函数引用:
        Consumer<String> consumer = System.out::println;	//此处只是引用out对象的println方法,而不是调用
        consumer.accept("hello world");
2、构造引用
//普通构造引用
	
	Supplier<Students> students = Students::new;
    students.get().printClassInfo();
	
	class Students{
		public void printClassInfo(){
			System.out.println(this.getClass().getName());
		}
	}
	
	//数组构造引用
	  //可以传递一个参数(表示数组长度),返回数组对象,通过相应类型的构造引用创建对象。
	  Integer[] arr = new Integer[5];
	  Function<Integer, Integer[]> integersFunc = (len)->new Integer[len];
	  //Integer数组的构造引用
	  Function<Integer, Integer[]> integersFunc1 = Integer[]::new;
	  Integer[] apply = integersFunc1.apply(6);
	  System.out.println(Arrays.toString(apply));

四、Stream(流) API

1、定义

        jdk1.8提供的一种数据流水线的处理API。

2、特点

        * Stream不会存储数据
        * Stream在处理完成后会返回一个持有新数据的Stream对象
        * Stream中存在持续执行和终止执行的方法(延迟现象)

3、流处理中的持续执行(中间方法)和终止方法

1-中间方法:(流水线的一个操作,不会导致流程结束)

        map (mapToInt, flatMap 等)、 filter、 distinct、

        sorted、 peek、 limit、 skip、 parallel、

        sequential、 unordered

2-终止方法:(调用后,流程结束)

        forEach、 forEachOrdered、 toArray、 reduce、

        collect、 min、 max、 count、 anyMatch、 allMatch、

        noneMatch、 findFirst、 findAny、 iterator

案例1:将流中的数据进行foreach遍历

int[] ints = {12, 25, 66, 71, 45, 99};
IntStream stream = Arrays.stream(ints);
stream.forEach(System.out::println);

案例2:通过中间方法filter过滤数据集中的大于等于60分的值

stream.filter((a)->(a>=60)?true:false).forEach(System.out::println);
4、如何将数据集转化为Stream

1-数组

        Arrays工具类中的stream方法

2-集合

        集合类身上具有stream方法

3-Stream自带的方法

        Stream.of(T ... data)

五、接口中的默认方法和静态方法

        默认方法: 被default修饰的方法。

        静态方法:直接通过接口名调用,而不需要创建接口的实现类实例。

六、日期时间API

        LocalDate; //日期

        LocalTime; //时间

        LocalDateTime; //日期时间

案例:

//获取当前时间
		  LocalDateTime now = LocalDateTime.now();
		  //System.out.println(now.toString());

		  //日期时间格式化输出
		  String format = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
		  System.out.println(format);

		  //5天之后的日期
		  LocalDateTime localDateTime = now.plusDays(5);
		  System.out.println(localDateTime.toString());

		  //计算两个日期之间相差的天数
		  //创建未来某个日期的对象: 2023-1-15 10:00:00
		  LocalDateTime parse = LocalDateTime.parse("2023-01-15T10:00:00");

		  long until = Math.abs(parse.until(now, ChronoUnit.DAYS));
		  System.out.println(until);

七、OPtional(重要)

1、定义

        OPtional是一个数据容器,可以更好的表达数据是否存在的状态,对空指针可控。

2、常用方法

        Optional.of(T t):创建一个Optional实例;

        Optional.ofNullable(T t):若t不为空创建一个Optional实例否则创建一个空实例;

        Optional.empty():创建一个空的Optional实例;

        isPresent():判断是否包含值;

        orElse(T t):如果调用对象包含值,返回该值,否则返回t;

        orElseGet(Supplier s):如果调用对象包含值,返回该值,否则返回s获取的值;

        map(Function f):如果有值对其处理,并返回处理后的Optional,否则返回Optional.empty();

        flatMap(Function mapper):与map类似,要求返回值必须是Optional。

案例:避免空指针问题

String str = null;
	//Optional 控制空指针,避免程序运行时由于异常导致终止
	Optional<String> str1 = Optional.ofNullable(str);
	System.out.println(str1.orElse("").length());

八、反射

1、定义

        反射是指动态获取类或者对象的信息(属性和方法),以及动态操作对象的属性和方法的类,动态分析和使用类的信息的类。java为程序员提供的一种可以基于已经存在的对象进行反向探知的能力。

2、反射中所涉及的类

        Class //表示一个类

        Method //方法

        Field //字段,属性

        Constructor //构造器

3、获取class的三种方式

要操作一个类的字节码,需要首先获取到这个类的字节码。

  • Class.forName() //Class的静态方法

  • 对象.getClass() //通过对象的getClass方法

  • 类.class //通过类的class属性

案例1:Class.forName

 //字节码
  Class<?> uClass = Class.forName("cn.hxzy.apimod.day14.UserControl");

  //转化为对应的类型
  UserControl userControl = (UserControl) uClass.newInstance();

  boolean stat = userControl.registUser("张三", "123456");
  System.out.println(stat);

案例2:类.Class

 Class<UserControl> userControlClass = UserControl.class;
  //new UserControl()
  UserControl userControl = userControlClass.newInstance();   

案例3:获取所有方法

 //获取类中的所有方法
  Method[] methods = userControlClass.getMethods();   //包括隐藏父类Object中的方法
  Stream<Method> metdStream = Stream.of(methods);
  metdStream.forEach(System.out::println);

案例4:获取字段(忽略权限修饰符)

Field[] fields = userControlClass.getDeclaredFields();
Stream<Field> fields1 = Stream.of(fields);
fields1.forEach(System.out::println);

案例5:获取构造器

//获取构造
Constructor<?>[] constructors = userControlClass.getDeclaredConstructors();
Stream<Constructor<?>> constructors1 = Stream.of(constructors);
constructors1.forEach(System.out::println);

案例6:通过构造器创建对象

Class<UserControl> userControlClass = UserControl.class;

//基于带参数的构造器创建对象
Constructor<UserControl> constructor = userControlClass
        .getDeclaredConstructor(Integer.class, String.class, String.class, String.class);
constructor.setAccessible(true);    //允许访问
UserControl userControl = constructor.newInstance(1, "zhangsan", "123456", "成都");
String address = userControl.getAddress();
System.out.println(address);

案例7:执行方法

 //获取字节码
  Class<UserControl> userControlClass = UserControl.class;

  //获取当前对象
  UserControl userControl = userControlClass.newInstance();

  //获取方法
  Method registUser = userControlClass.getMethod("registUser", String.class, String.class);

  //执行方法
  Object methodResult = registUser.invoke(userControl, "lisi", "ls123456");
  System.out.println(methodResult);

案例8:设置字段

//获取字节码
Class<UserControl> userControlClass = UserControl.class;

//创建对象
UserControl userControl = userControlClass.newInstance();

//获取字段
Field name = userControlClass.getDeclaredField("name");
name.setAccessible(true);
name.set(userControl, "wangwu");

Object nameField = name.get(userControl);
System.out.println(nameField);

案例9:获取类实现的接口

//获取字节码
Class<UserControl> userControlClass = UserControl.class;

//获取当前类实现的接口
Class<?>[] interfaces = userControlClass.getInterfaces();
for (Class<?> interfaceItm:interfaces) {
    System.out.println(interfaceItm.getName());
}

案例10:获取注解

//获取字节码
Class<UserControl> userControlClass = UserControl.class;

//获取方法
Method registUser = userControlClass
        .getMethod("registUser", String.class, String.class);

//获取当前方法上被修饰的注解,如果当前方法上被@Deprecated修饰,则输出,该方法不可用
Deprecated annotation = registUser.getAnnotation(Deprecated.class);
//System.out.println(annotation.toString());
if(null != annotation) {
    System.out.println("方法即将被废弃,不推荐使用!");
}

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

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

相关文章

jmeter基础05_第1个http请求

本节课使用网站“httpbin.org”进行基础的http请求全流程。 请求获取httpbin.org的首页&#xff1a; 请求方法&#xff1a;GET URL&#xff1a;http://httpbin.org 参数&#xff1a;无 1、操作步骤 ① 打开jmeter&#xff1a;命令行窗口输入“jmeter”并回车。 ② 添加线程组…

SpringBoot+MyBatis+MySQL的Point实现范围查找

前言 最近做了一个功能&#xff0c;需要通过用户当前位置点获取指定范围内的数据。由于后端存储用的是 MySQL&#xff0c;故选择使用 MySQL 中的 Point 实现范围查找功能。ORM 框架用的是 MyBatis&#xff0c;MyBatis 原生并不支持 Point 字段与 POJO 的映射&#xff0c;需要自…

计算机网络中的数据包传输机制详解

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 计算机网络中的数据包传输机制详解 计算机网络中的数据包传输机制详解 计算机网络中的数据包传输机制详解 引言 数据包的基本概念…

DAY110代码审计-PHP框架开发篇ThinkPHP版本缺陷不安全写法路由访问利用链

https://blog.csdn.net/m0_60571842/article/details/139057898 看这个原作者 知识点&#xff1a; 1、PHP框架学习-ThinkPHP-架构&调试&路由&接受2、PHP框架审计-ThinkPHP-不安全写法&版本漏洞 框架审计总结方向&#xff1a; 1、版本不安全写法怎么检测 -本…

【日志】力扣11.盛水最多的容器

2024.11.15 【力扣刷题】 11.盛水最多的容器 - 力扣&#xff08;LeetCode&#xff09; int maxArea(int* height, int heightSize) {int max 0;int V 0;int left 0;int right heightSize - 1;while (left < right) {if (height[left] > height[right]) {V height[r…

leetcode100:相同的树

给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&#xff1a;true示例 2&…

❤React-React 组件基础(类组件)

❤React-React 组件基础 1、组件化开发介绍 组件化开发思想&#xff1a;分而治之 React的组件按照不同的方式可以分成类组件&#xff1a; 划分方式一&#xff08;按照组件的定义方式&#xff09; 函数组件(Functional Component )和类组件(Class Component)&#xff1b; …

SQL面试题——抖音SQL面试题 主播播出时长

主播播出时长 现有如下数据,主播id、房间号、播出的批次号,每个批次号进出房间的时间戳、分区时间: 每一次直播都有一个上播和下播,每个房间里,同一个批次号会有两条数据,分别记录了上播和下播时间,求每个主播的播出时长? 通过上面的数据,可以清晰的看出,同一个批次…

无人机检测车辆——多目标检测

目录 YOLOv3&#xff08;You Only Look Once version 3&#xff09;简介 YOLOv3 的主要特点 YOLOv3 的结构 1. 特征提取网络&#xff08;Backbone&#xff09; 2. 检测头&#xff08;Head&#xff09; 3. 输出层 YOLOv3 损失函数 YOLOv3 的优势 YOLOv3 的应用 YOLOv3…

【MyBatis操作数据库】XML配置

【配置连接字符串和MyBatis】 注意&#xff0c;这行代码代表着xml必须在mapper文件夹的下面&#xff08;路径必须保持一致&#xff09; 配置完文件后&#xff0c;需要写持久层代码 添加 mapper 接⼝&#xff1a; 添加 UserInfoXMLMapper这样的xml文件&#xff1a; 单元测试&a…

基础:用卷积神经网络(CNN)进行猫狗图像分类

在本篇教程中&#xff0c;我们将通过卷积神经网络&#xff08;CNN&#xff09;实现一个简单的猫狗图像分类器。我们将介绍如何处理数据、构建CNN模型、训练模型并在测试集上进行预测。最终&#xff0c;你将能够用这个模型对未知图像进行猫狗分类。 1. 环境准备 首先&#xf…

node对接ChatGpt的流式输出的配置

node对接ChatGpt的流式输出的配置 首先看一下效果 将数据用流的方式返回给客户端,这种技术需求在传统的管理项目中不多见,但是在媒体或者有实时消息等功能上就会用到,这个知识点对于前端还是很重要的。 即时你不写服务端,但是服务端如果给你这样的接口,你也得知道怎么去使用联…

聊聊Flink:Flink的运行时架构

一、运行时架构 上一篇我们可以看到Flink的核心组件的Deploy层&#xff0c;该层主要涉及了Flink的部署模式&#xff0c;Flink支持多种部署模式&#xff1a;本地、集群&#xff08;Standalone/YARN&#xff09;、云&#xff08;GCE/EC2&#xff09;。 Local&#xff08;本地&am…

【动手学电机驱动】 STM32-FOC(7)MCSDK Pilot 上位机控制与调试

STM32-FOC&#xff08;1&#xff09;STM32 电机控制的软件开发环境 STM32-FOC&#xff08;2&#xff09;STM32 导入和创建项目 STM32-FOC&#xff08;3&#xff09;STM32 三路互补 PWM 输出 STM32-FOC&#xff08;4&#xff09;IHM03 电机控制套件介绍 STM32-FOC&#xff08;5&…

华为云前台用户可挂载数据盘和系统盘是怎么做到的?

用户可以选择磁盘类型和容量&#xff0c;其后台是管理员对接存储设备 1.管理员如何在后台对接存储设备&#xff08;特指业务存储&#xff09; 1.1FusionSphere CPS&#xff08;Cloud Provisionivice&#xff09;云装配服务 它是first node https://10.200.4.159:8890 对接存…

Python爬虫知识体系-----requests-----持续更新

数据科学、数据分析、人工智能必备知识汇总-----Python爬虫-----持续更新&#xff1a;https://blog.csdn.net/grd_java/article/details/140574349 文章目录 一、安装和基本使用1. 安装2. 基本使用3. response常用属性 二、get请求三、post请求四、代理 一、安装和基本使用 1.…

区块链技术在数据安全中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 区块链技术在数据安全中的应用 区块链技术在数据安全中的应用 区块链技术在数据安全中的应用 引言 区块链技术基础 1.1 区块链的…

RK3568平台开发系列讲解(GPIO篇)GPIO的sysfs调试手段

🚀返回专栏总目录 文章目录 一、内核配置二、GPIO sysfs节点介绍三、命令行控制GPIO3.1、sd导出GPIO3.2、设置GPIO方向3.3、GPIO输入电平读取3.4、GPIO输出电平设置四、Linux 应用控制GPIO4.1、控制输出4.2、输入检测4.3、使用 GPIO 中断沉淀、分享、成长,让自己和他人都能有…

电商系统开发:Spring Boot框架实战

3 系统分析 当用户确定开发一款程序时&#xff0c;是需要遵循下面的顺序进行工作&#xff0c;概括为&#xff1a;系统分析–>系统设计–>系统开发–>系统测试&#xff0c;无论这个过程是否有变更或者迭代&#xff0c;都是按照这样的顺序开展工作的。系统分析就是分析系…

从电动汽车到车载充电器:LM317LBDR2G 线性稳压器在汽车中的多场景应用

附上LM317系列选型&#xff1a; LM317BD2TG-TO-263 LM317BTG-TO-220 LM317BD2TR4G-TO-263 LM317D2TG-TO-263 LM317D2TR4G-TO-263 LM317TG-TO-220 LM317LBDR2G-SOP-8 LM317LDR2G-SOP-8 LM317MABDTG-TO-252 LM317MABDTRKG-TO-252 LM317MA…