当前位置: 首页 > news >正文

【JAVA入门】Day35 - 方法引用

【JAVA入门】Day35 - 方法引用


文章目录

  • 【JAVA入门】Day35 - 方法引用
    • 一、方法引用的分类
      • 1.引用静态方法
      • 2.引用成员方法
        • 2.1 引用其他类的成员方法
        • 2.2 引用本类和父类的成员方法
        • 2.3 引用构造方法
        • 2.4 使用类名引用成员方法
        • 2.5 引用数组的构造方法
    • 二、方法引用的例题


        方法引用就是“把已经有的方法当作函数式接口中抽象方法的方法体”来使用。

        下面是一个排序方法,它的第二个参数是一个 Comparator 接口的实现类,它是一个函数式接口,因此我们可以用方法引用改写这段代码。

Arrays.sort(arr, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}
});

        直接将已经存在的方法作为第二个参数。

public int subtraction(int n1, int n2) {return n2 - n1;
}Arrays.sort(arr, 比较规则 );

        要使用方法引用有一些限制:

  • 最重要的限制是,引用处必须是一个函数式接口,是可以把接口实现类作为参数传递的。
  • 对于被引用的方法有以下三个限制:
    1.被引用的方法必须已经存在了。
    2.被引用的方法的形参返回值需要跟抽象方法保持一致。
    3.被引用的方法的功能要满足当前需求。

        以下面这段代码为例,我们将演示方法引用相较于之前方法的简洁性。

package Functions;import java.util.Arrays;
import java.util.Comparator;public class FunctionDemo1 {public static void main(String[] args) {//需求:创建一个数组,进行倒序排序Integer[] arr = {3,5,4,1,6,2};//匿名内部类Arrays.sort(arr, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1;}});//lambda表达式Arrays.sort(arr, (Integer o1, Integer o2) -> {return o2 - o1;});//lambda表达式简化格式Arrays.sort(arr, (o1, o2) -> o2 - o1);//方法引用//表示引用FunctionDemo1类里面的subtraction方法//把这个方法当作抽象方法的方法体Arrays.sort(arr, FunctionDemo1::subtraction);System.out.println(Arrays.toString(arr));}//被引用的方法可以是Java已经写好的,也可以是一些第三方工具类public static int subtraction(int num1, int num2) {return num2 - num1;}
}

一、方法引用的分类

        方法引用一般就分为三大类:引用静态方法、引用成员方法(这个分为引用其他类的成员方法、引用本类的成员方法、引用父类的成员方法)、引用构造方法。但是也有其他调用方式,比如:使用类名引用成员方法、引用数组的构造方法。

1.引用静态方法

格式:

类名::静态方法

范例:

Integer::parseInt

【练习】集合中有“1”“2”“3”“4”“5”五个字符串数字,要求把他们变成 int 类型。

package Functions;import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;public class FunctionDemo2 {public static void main(String[] args) {/*集合中有“1”“2”“3”“4”“5”五个字符串数字,要求把他们变成 int 类型。*///1.创建集合并添加元素ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "1","2","3","4","5");//2.常规方式ArrayList<Integer> list2 = new ArrayList<>();for (String s : list) {int i = Integer.parseInt(s);list2.add(i);}//3.方法引用
/*        list.stream().map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {return Integer.parseInt(s);}}).forEach(s -> System.out.println(s));*///1.方法需要已经存在//2.方法的形参和返回值需要跟抽象方法的形参和返回值保持一致//3.方法的功能需要把形参的字符串转换成整数//引用的是Integer方法中的pareInt()方法list.stream().map(Integer::parseInt).forEach(s -> System.out.println(s));}
}

2.引用成员方法

格式:

对象::成员方法

① 其他类:

其他类对象::方法名

② 本类:

this::方法名

③ 父类:

super::方法名
2.1 引用其他类的成员方法
package Functions;import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Predicate;public class FunctionDemo3 {public static void main(String[] args) {/*只要以张开头的,而且名字是3个字的*///1.创建集合ArrayList<String> list = new ArrayList<>();//2.添加数据Collections.addAll(list, "张无忌","周芷若","赵敏","张强","张三丰");//3.过滤数据//完整写法
/*        list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.startsWith("张") && s.length() == 3;}}).forEach(s -> System.out.println(s));*///方法引用写法//引用其他类的成员方法//已知有另一个类StringOperation中有同样功能方法//成员方法需要创建对象来使用,因此要先创建StringOperation类对象StringOperation so = new StringOperation();list.stream().filter(so::stringJudge);}
}
2.2 引用本类和父类的成员方法

        要注意,要引用本类成员方法时,若引用处位于 main() 方法中,它是一个静态方法,静态方法是没有 this 和 super 变量的,因此这里就只能先创建好本类的对象再进行调用。

package Functions;import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Predicate;public class FunctionDemo3 {public static void main(String[] args) {/*只要以张开头的,而且名字是3个字的*///1.创建集合ArrayList<String> list = new ArrayList<>();//2.添加数据Collections.addAll(list, "张无忌","周芷若","赵敏","张强","张三丰");//3.过滤数据//完整写法
/*        list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.startsWith("张") && s.length() == 3;}}).forEach(s -> System.out.println(s));*///方法引用写法//引用本类的成员方法//已知本类中有同样功能方法//成员方法需要创建对象来使用,因此要先创建本类对象list.stream().filter(new FunctionDemo3()::stringJudge);}public boolean stringJudge(String s) {return s.startsWith("张") && s.length() == 3;}
}

        因此,想要使用 this 和 super,就要在一个非静态方法中,如下面的例子:
        下面的例子中,我们创建了一个窗体,自己在本类中写了一个按钮的事件监听方法,并作为参数传给了按钮的addActionListener()方法,这里就是使用了本类的方法引用,这样做使得该窗体无需实现 ActionListener 接口也能自己实现按钮点击的事件逻辑。

package Functions;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;public class LoginJFrame extends JFrame {//创建一个按钮,点击按钮打印一句话JButton go = new JButton("Go");public LoginJFrame() {//初始化界面initJFrame();//添加组件initView();//显示界面this.setVisible(true);}//设置界面public void initJFrame() {//设置宽高this.setSize(400,500);}//添加组件public void initView() {go.setBounds(120,274,150,50);this.getContentPane().add(go);//给按钮添加点击事件//该方法形参是一个函数式接口//因此可以在此处使用方法引用//此时在本类可以自己写一个按钮监听的方法操作,作为方法引用,使用this::method传入//这样可以使得该窗体不必实现ActionListener接口也能实现按钮的点击事件go.addActionListener(this::method);}//自己写的按钮监听方法public void method(ActionEvent e){Object obj = e.getSource();if(obj == go){System.out.println("go按钮被点击了");}}
}

        下面的例子中,我们让一个窗体继承了一个 MyJFrame 类,再让 MyJFrame 类继承自 JFrame,然后我们在 MyJFrame 类中自己编写了一个事件监听方法 method,然后在 MyJFrame 类中让按钮的 addActionListener() 方法引用 MyJFrame 类中的事件监听方法 method,这样就实现了引用自父类的成员方法。

父类 MyJFrame:

package Functions;import javax.swing.*;
import java.awt.event.ActionEvent;//注意形参和原方法保持一致
public class MyJFrame extends JFrame {public void method(ActionEvent e){System.out.println("go按钮被点击了");}
}

子类 LoginJFrame:

package Functions;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;public class LoginJFrame extends MyJFrame {//创建一个按钮,点击按钮打印一句话JButton go = new JButton("Go");public LoginJFrame() {//初始化界面initJFrame();//添加组件initView();//显示界面this.setVisible(true);}//设置界面public void initJFrame() {//设置宽高this.setSize(400,500);}//添加组件public void initView() {go.setBounds(120,274,150,50);this.getContentPane().add(go);//给按钮添加点击事件//该方法形参是一个函数式接口//因此可以在此处使用方法引用//此时在父类可以自己写一个按钮监听的方法操作,作为方法引用,使用super::method传入go.addActionListener(super::method);}
}

        由上面的例子可以看出,方法引用可以代替函数式接口作为方法的参数传递,利用方法引用可以调整代码结构,省去实现多余的接口。

2.3 引用构造方法

        我们引用构造方法就是为了创建对象。

格式:

类名::new

范例:

Student::new

        以下面的例子为讲解,我们为什么要引用构造方法。
        首先我们在 Student 类中重载了一个构造方法,它是为了适配构造方法引用而设的。

package Functions;import java.util.Objects;public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;this.age = age;}//用方法引用,在Student类中重载构造方法,按照上面的public Student apply(String s)的方法体重写//str表示流里面的每一个数据public Student(String str){this.name = str.split("-")[0];this.age = Integer.parseInt(str.split("-")[1]);}}

        然后我们在测试类中引用构造方法,代替了原来的 map 方法中的函数式接口重写的方法 apply。

package Functions;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;public class FunctionDemo4 {/*集合里存储姓名和年龄,比如:张无忌,15要求:将数据封装成Student对象并收集到List集合中*/public static void main(String[] args) {//1.创建集合对象ArrayList<String> list = new ArrayList<>();//2.添加数据Collections.addAll(list, "张无忌-15","周芷若-14","赵敏-13","张强-20","张三丰-100","张翠山-40","张良-35","王二麻子-37","谢广坤-41");//3.封装成Student对象并收集到List集合中//String --> Student/*        //用map方法List<Student> newList = list.stream().map(new Function<String, Student>() {@Overridepublic Student apply(String s) {return new Student(s.split("-")[0], Integer.parseInt(s.split("-")[1]));}}).collect(Collectors.toList());*///用方法引用,在Student类中重载构造方法,按照上面的public Student apply(String s)的方法参数和功能重写//构造方法没有返回值,只要保证重载的构造方法对象和你原方法返回的对象保持一致即可List<Student> newList = list.stream().map(Student::new).collect(Collectors.toList());}
}

        这里要注意的就是,构造方法生成的对象,要和原来方法你要求返回的对象一致(姓名、年龄的格式),且构造方法的参数必须和原方法保持一致(String s)。

2.4 使用类名引用成员方法

        直接用类名引用成员方法。
格式:

类名::成员方法

范例:

String::substring

【练习】集合里有一些字符串,要求变成大写后进行输出。

package Functions;import java.util.ArrayList;
import java.util.Collections;
import java.util.function.Function;public class FunctionDemo5 {public static void main(String[] args) {/*集合里有一些字符串,要求变成大写后进行输出。类名::成员方法规则:1.需要有函数式接口2.被引用的方法必须已经存在3.被引用方法的形参,需要跟抽象方法的第二个形参到最后一个形参保持一致,返回值需要保持一致4.被引用的方法功能要满足当前需求抽象方法形参的详解:第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法(比如第一个参数是String类型,那么只能引用String类中的方法)在Stream流当中,第一个参数一般都表示流里面的每一个数据假设流里面的数据是字符串,那么使用这种方式进行方法调用,只能引用String这个类中的方法第二个参数到最后一个参数:跟被引用的方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法*///1.创建集合对象ArrayList<String> list = new ArrayList<>();//2.添加数据Collections.addAll(list, "aaa", "bbb", "ccc", "ddd");//3.变成大写//String --> String
/*        list.stream().map(new Function<String, String>() {@Overridepublic String apply(String s) {return s.toUpperCase();}}).forEach(s -> System.out.println(s));*///拿流里面的每一个数据,去调用String类中的toUpperCase()方法,方法的返回值就是转换之后的字符串list.stream().map(String::toUpperCase).forEach(s -> System.out.println(s));}
}

这种方法有一定的局限性:

1.它不能引用所有类中的成员方法。
2.它能引用的类中的成员方法,取决于它的抽象方法(上面代码中的 apply(String s))的第一个参数类型,这个参数是什么类型,它就只能引用这个类中的方法。
3.如果这个抽象方法(apply(String s))没有第二个及以后的参数,那么它就可以引用一个类中的空参方法。

2.5 引用数组的构造方法

格式:

数据类型[]::new

范例:

Integer[]::new

【练习】集合中存储一些整数,然后收集到数组当中。

package Functions;import java.util.ArrayList;
import java.util.Collections;
import java.util.function.IntFunction;public class FunctionDemo6 {public static void main(String[] args) {/*细节:数组的类型,需要跟流中的数据的类型保持一致*///1.创建集合ArrayList<Integer> list = new ArrayList<>();Collections.addAll(list,1,2,3,4,5,6,7,8,9,10);//2.收集到数组当中
/*        Integer[] arr = list.stream().toArray(new IntFunction<Integer[]>() {@Overridepublic Integer[] apply(int value) {return new Integer[value];}});*///此时会将流中每一个数据存入生成的数组中list.stream().toArray(Integer[]::new);}
}

二、方法引用的例题

【练习1】集合中存一些字符串,比如:张三,23。收集到Student数组当中。

package Functions;import JavaStudy1.Array.Array;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.stream.Collectors;public class FuntcionTest1 {public static void main(String[] args) {/*集合中存一些字符串,比如:张三,23。收集到Student数组当中。*///1.创建集合添加元素ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张无忌-15","周芷若-14","赵敏-13","张强-20","张三丰-100","张翠山-40","张良-35","王二麻子-37","谢广坤-41");//2.先把字符串变成Student对象,然后再把Student对象收集起来//String --> StudentStudent[] arr = list.stream().map(Student::new).collect(Collectors.toList()).toArray(Student[]::new);System.out.println(Arrays.toString(arr));}
}

【练习2】创建集合并添加学生对象,要求获取姓名放到数组中。

package Functions;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;public class FunctionTest2 {public static void main(String[] args) {/*创建集合并添加学生对象,要求获取姓名放到数组中。"张无忌-15","周芷若-14","赵敏-13","张强-20","张三丰-100","张翠山-40","张良-35","王二麻子-37","谢广坤-41"*///1.创建集合添加数据ArrayList<Student> list = new ArrayList<>();Collections.addAll(list, new Student("张无忌",15),new Student("周芷若",14),new Student("赵敏",13),new Student("张强",20),new Student("张三丰",100),new Student("张翠山",40));//2.把姓名获取出来生成字符串数组//Student --> StringString[] arr = list.stream().map(Student::getName).toArray(String[]::new);System.out.println(Arrays.toString(arr));}
}

【练习3】创建集合添加学生对象,把姓名和年龄拼成:张三-23的字符串,并放到数组当中。

package Functions;import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;public class FunctionTest3 {public static void main(String[] args) {/*创建集合添加学生对象,把姓名和年龄拼成:张三-23的字符串,并放到数组当中。*///1.创建集合并添加学生对象ArrayList<Student> list = new ArrayList<>();Collections.addAll(list, new Student("张无忌",15),new Student("周芷若",14),new Student("赵敏",13),new Student("张强",20),new Student("张三丰",100),new Student("张翠山",40));//2.取出姓名和年龄拼成字符串//Student --> StringString[] arr = list.stream().map(Student::toString).toArray(String[]::new);System.out.println(Arrays.toString(arr));}
}

相关文章:

【JAVA入门】Day35 - 方法引用

【JAVA入门】Day35 - 方法引用 文章目录 【JAVA入门】Day35 - 方法引用一、方法引用的分类1.引用静态方法2.引用成员方法2.1 引用其他类的成员方法2.2 引用本类和父类的成员方法2.3 引用构造方法2.4 使用类名引用成员方法2.5 引用数组的构造方法 二、方法引用的例题 方法引用就…...

集合及映射

1、集合类图 1&#xff09;ArrayList与LinkedList 区别 LinkedList 实现了双向队列的接口&#xff0c;对于数据的插入速度较快&#xff0c;只需要修改前后的指向即可&#xff1b;ArrayList对于特定位置插入数据&#xff0c;需要移动特定位置后面的数据&#xff0c;有额外开销 …...

软考基础知识之计算机网络

目录 前言 网络架构与协议 网络互联模型 1、OSI/RM 各层的功能 2、TCP/IP 结构模型 常见的网络协议 1、应用层协议 2、传输层协议 3、网络层协议 IPv6 前言 从古代的驿站、 八百里快马&#xff0c; 到近代的电报、 电话&#xff0c; 人类对于通信的追求从未间断&…...

云手机怎样简化海外社媒平台运营

随着越来越多的卖家希望拓展海外市场&#xff0c;运营TikTok、Facebook等社交媒体平台已经成为吸引流量和促进销售的重要手段。然而&#xff0c;在管理海外社媒账号的过程中&#xff0c;许多人会面临网络连接的问题。这时&#xff0c;使用一款高效便捷的云手机工具就显得尤为便…...

创业者必读!选择拍卖源码还是自建开发,哪种方案更安全?

在当今数字化时代&#xff0c;拍卖平台作为一种独特的电子商务模式&#xff0c;正逐渐成为人们关注的焦点。随着互联网技术的发展&#xff0c;网络安全问题变得越来越突出。如何保障用户数据安全&#xff0c;防止信息泄露及攻击事件的发生&#xff0c;已经成为拍卖软件开发者面…...

Spring Cloud Gateway整合基于STOMP协议的WebSocket实战及遇到问题解决

本实例介绍了Spring Cloud Gateway整合基于STOMP协议的WebSocket的实现。开发了聊天功能,和用户在线状态。解决了协议gateway整合websocket出现的问题 技术点 Spring Cloud GatewayNacosWebSocketSTOMPWebSocket与STOMP协议详解 1. WebSocket WebSocket 是一种通信协议,提…...

软考高级:系统架构设计师——软件架构设计 Chapter 笔记

软考高级&#xff1a;系统架构设计师——软件架构设计 1 软件架构设计—基本概念架构所处的位置架构发展历程架构的“41”视图例题 架构描述语言&#xff08;ADL&#xff09;例题 2软件架构设计—架构风格数据流风格调用/返回 风格独立构件风格虚拟机风格仓库风格&#xff08;以…...

PageHelper组件 实现前端分页查询功能

Hi~&#xff01;这里是一颗小谷粒&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~&#x1f4a5;&#x1f4a5;个人主页&#xff1a;一颗小谷粒&#x1f4a5;&#x1f4a5;所属专栏&#xff1a;Web前端开发 &#x1f4a5;&#x1f4a5;博主…...

线性回归与逻辑回归在模型参数优化上的比较

概述 线性回归和逻辑回归是两种基础且广泛应用的预测模型。尽管它们在很多方面有相似之处&#xff0c;如都使用梯度下降算法来优化模型参数&#xff0c;但在优化目标和方法上存在一些关键差异。本文将探讨这两种模型在参数优化上的差异&#xff0c;并提供相应的代码示例。 线…...

JavaWeb JavaScript 10.日程管理 第一期

自我消耗&#xff0c;敏感是我&#xff0c; 明媚是我&#xff0c; 我横跳在不同的情绪中 —— 24.8.31 一、登录页及校验 1.校验账号格式 // 校验账号格式function checkUsername(){// 定义正则表达式表示字符串规则var usernameReg /^[a-zA-Z0-9]{5,10}$/;// 获取用户名输入…...

redis为什么快

春内存访问&#xff0c;相比数据库访问磁盘要快单线程&#xff0c;避免上下文切换带来的cpu开销渐进式Rehash。减少阻塞网络模型多路复用&#xff0c;reactor模型 常用基本数据类型 5个基本数据类型2个高级数据结构&#xff08;bitmaps、hyperlog&#xff09; redis高级功能…...

十分钟学会Kubernetes(K8S) 部署SpringBoot3.0

1、十分钟学会Kubernetes(K8S) 部署SpringBoot3.0 本课程以 Java 后端开发的视角&#xff0c;带着大家从零基础入门 k8s 实战&#xff0c;掌握企业级容器化管理平台的各种实战应用&#xff0c;以及 Prometheus 监控告警、ELK 日志收集、DevOps 等众多实战课程内容&#xff0c;大…...

顺序表的插入与删除

一.插入&#xff1a;插入前先移动后面的元素 1.图解&#xff1a; 在b和d之间插入c&#xff0c;此时就需要把d&#xff0c;e&#xff0c;f都向后移一位&#xff0c;腾出一个位置后插入c。 2.代码实现&#xff1a; #include<stdio.h> #define MaxSize 10 //定义最大长度…...

FFMPEG -- 音频开发

1&#xff1a;前言 在进行音频开发之前需要先知道一些基础知识&#xff0c;一些有必要的指导的概念。 1.1 声音的产生、获取和转换 声音的产生的本质是靠震动&#xff0c;声音的传播需要借助媒介&#xff0c;比如空气、液体、固体等媒介。在自然界中声音的可视化为音波的形式&…...

lxml官方入门教程(The lxml.etree Tutorial)翻译

lxml官方入门教程&#xff08;The lxml.etree Tutorial&#xff09;翻译 说明&#xff1a; 首次发表日期&#xff1a;2024-09-05官方教程链接&#xff1a; https://lxml.de/tutorial.html使用KIMI和豆包机翻水平有限&#xff0c;如有错误请不吝指出 这是一个关于使用lxml.et…...

string详解

Golang详解string 文章目录 Golang详解stringGolang中为什么string是只读的&#xff1f;stirng和[]byte的转化原理[]byte转string一定需要内存拷贝吗&#xff1f;字符串拼接性能测试 Golang中为什么string是只读的&#xff1f; 在Go语言中&#xff0c;string其实就是一个结构体…...

基于约束大于规范的想法,封装缓存组件

架构&#xff1f;何谓架构&#xff1f;好像并没有一个准确的概念。以前我觉得架构就是搭出一套完美的框架&#xff0c;可以让其他开发人员减少不必要的代码开发量&#xff1b;可以完美地实现高内聚低耦合的准则;可以尽可能地实现用最少的硬件资源&#xff0c;实现最高的程序效率…...

自动化测试面试真题(附答案)

一、编程语法题 1 、 python 有哪些数据类型 python 数据类型有很多&#xff0c;基本数据类型有整型&#xff08;数字&#xff09;、字符串、元组、列表、字典和布尔类型等 2 、怎么将两个字典合并 调用字典的 update 方法&#xff0c;合并 2 个字典。 3 、 json.l python …...

云原生架构概念

云原生架构概念 云原生架构&#xff08;Cloud Native Architechtrue&#xff09;作为一种现代软件开发的革新力量&#xff0c;正在逐渐改变企业构建、部署和管理应用程序的方式。它的核心优势在于支持微服务架构&#xff0c;使得应用程序能够分解为独立、松耦合的服务&#xf…...

85、 探针

一、pod的进阶 pod的进阶&#xff1a; 1.1、pod的生命周期当中的状态&#xff1a; 1、Running运行中&#xff0c;pod已经分配到节点上且pod内的容器正常运行。正常状态&#xff08;ready 1/1&#xff09;。 2、complete&#xff1a;完成之后退出&#xff0c;容器内的返回码…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统

医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上&#xff0c;开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识&#xff0c;在 vs 2017 平台上&#xff0c;进行 ASP.NET 应用程序和简易网站的开发&#xff1b;初步熟悉开发一…...

使用分级同态加密防御梯度泄漏

抽象 联邦学习 &#xff08;FL&#xff09; 支持跨分布式客户端进行协作模型训练&#xff0c;而无需共享原始数据&#xff0c;这使其成为在互联和自动驾驶汽车 &#xff08;CAV&#xff09; 等领域保护隐私的机器学习的一种很有前途的方法。然而&#xff0c;最近的研究表明&…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案

随着新能源汽车的快速普及&#xff0c;充电桩作为核心配套设施&#xff0c;其安全性与可靠性备受关注。然而&#xff0c;在高温、高负荷运行环境下&#xff0c;充电桩的散热问题与消防安全隐患日益凸显&#xff0c;成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...