【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)ArrayList与LinkedList 区别 LinkedList 实现了双向队列的接口,对于数据的插入速度较快,只需要修改前后的指向即可;ArrayList对于特定位置插入数据,需要移动特定位置后面的数据,有额外开销 …...
软考基础知识之计算机网络
目录 前言 网络架构与协议 网络互联模型 1、OSI/RM 各层的功能 2、TCP/IP 结构模型 常见的网络协议 1、应用层协议 2、传输层协议 3、网络层协议 IPv6 前言 从古代的驿站、 八百里快马, 到近代的电报、 电话, 人类对于通信的追求从未间断&…...
云手机怎样简化海外社媒平台运营
随着越来越多的卖家希望拓展海外市场,运营TikTok、Facebook等社交媒体平台已经成为吸引流量和促进销售的重要手段。然而,在管理海外社媒账号的过程中,许多人会面临网络连接的问题。这时,使用一款高效便捷的云手机工具就显得尤为便…...
创业者必读!选择拍卖源码还是自建开发,哪种方案更安全?
在当今数字化时代,拍卖平台作为一种独特的电子商务模式,正逐渐成为人们关注的焦点。随着互联网技术的发展,网络安全问题变得越来越突出。如何保障用户数据安全,防止信息泄露及攻击事件的发生,已经成为拍卖软件开发者面…...
Spring Cloud Gateway整合基于STOMP协议的WebSocket实战及遇到问题解决
本实例介绍了Spring Cloud Gateway整合基于STOMP协议的WebSocket的实现。开发了聊天功能,和用户在线状态。解决了协议gateway整合websocket出现的问题 技术点 Spring Cloud GatewayNacosWebSocketSTOMPWebSocket与STOMP协议详解 1. WebSocket WebSocket 是一种通信协议,提…...
软考高级:系统架构设计师——软件架构设计 Chapter 笔记
软考高级:系统架构设计师——软件架构设计 1 软件架构设计—基本概念架构所处的位置架构发展历程架构的“41”视图例题 架构描述语言(ADL)例题 2软件架构设计—架构风格数据流风格调用/返回 风格独立构件风格虚拟机风格仓库风格(以…...
PageHelper组件 实现前端分页查询功能
Hi~!这里是一颗小谷粒,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~💥💥个人主页:一颗小谷粒💥💥所属专栏:Web前端开发 💥💥博主…...
线性回归与逻辑回归在模型参数优化上的比较
概述 线性回归和逻辑回归是两种基础且广泛应用的预测模型。尽管它们在很多方面有相似之处,如都使用梯度下降算法来优化模型参数,但在优化目标和方法上存在一些关键差异。本文将探讨这两种模型在参数优化上的差异,并提供相应的代码示例。 线…...
JavaWeb JavaScript 10.日程管理 第一期
自我消耗,敏感是我, 明媚是我, 我横跳在不同的情绪中 —— 24.8.31 一、登录页及校验 1.校验账号格式 // 校验账号格式function checkUsername(){// 定义正则表达式表示字符串规则var usernameReg /^[a-zA-Z0-9]{5,10}$/;// 获取用户名输入…...
redis为什么快
春内存访问,相比数据库访问磁盘要快单线程,避免上下文切换带来的cpu开销渐进式Rehash。减少阻塞网络模型多路复用,reactor模型 常用基本数据类型 5个基本数据类型2个高级数据结构(bitmaps、hyperlog) redis高级功能…...
十分钟学会Kubernetes(K8S) 部署SpringBoot3.0
1、十分钟学会Kubernetes(K8S) 部署SpringBoot3.0 本课程以 Java 后端开发的视角,带着大家从零基础入门 k8s 实战,掌握企业级容器化管理平台的各种实战应用,以及 Prometheus 监控告警、ELK 日志收集、DevOps 等众多实战课程内容,大…...
顺序表的插入与删除
一.插入:插入前先移动后面的元素 1.图解: 在b和d之间插入c,此时就需要把d,e,f都向后移一位,腾出一个位置后插入c。 2.代码实现: #include<stdio.h> #define MaxSize 10 //定义最大长度…...
FFMPEG -- 音频开发
1:前言 在进行音频开发之前需要先知道一些基础知识,一些有必要的指导的概念。 1.1 声音的产生、获取和转换 声音的产生的本质是靠震动,声音的传播需要借助媒介,比如空气、液体、固体等媒介。在自然界中声音的可视化为音波的形式&…...
lxml官方入门教程(The lxml.etree Tutorial)翻译
lxml官方入门教程(The lxml.etree Tutorial)翻译 说明: 首次发表日期:2024-09-05官方教程链接: https://lxml.de/tutorial.html使用KIMI和豆包机翻水平有限,如有错误请不吝指出 这是一个关于使用lxml.et…...
string详解
Golang详解string 文章目录 Golang详解stringGolang中为什么string是只读的?stirng和[]byte的转化原理[]byte转string一定需要内存拷贝吗?字符串拼接性能测试 Golang中为什么string是只读的? 在Go语言中,string其实就是一个结构体…...
基于约束大于规范的想法,封装缓存组件
架构?何谓架构?好像并没有一个准确的概念。以前我觉得架构就是搭出一套完美的框架,可以让其他开发人员减少不必要的代码开发量;可以完美地实现高内聚低耦合的准则;可以尽可能地实现用最少的硬件资源,实现最高的程序效率…...
自动化测试面试真题(附答案)
一、编程语法题 1 、 python 有哪些数据类型 python 数据类型有很多,基本数据类型有整型(数字)、字符串、元组、列表、字典和布尔类型等 2 、怎么将两个字典合并 调用字典的 update 方法,合并 2 个字典。 3 、 json.l python …...
云原生架构概念
云原生架构概念 云原生架构(Cloud Native Architechtrue)作为一种现代软件开发的革新力量,正在逐渐改变企业构建、部署和管理应用程序的方式。它的核心优势在于支持微服务架构,使得应用程序能够分解为独立、松耦合的服务…...
85、 探针
一、pod的进阶 pod的进阶: 1.1、pod的生命周期当中的状态: 1、Running运行中,pod已经分配到节点上且pod内的容器正常运行。正常状态(ready 1/1)。 2、complete:完成之后退出,容器内的返回码…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
dedecms 织梦自定义表单留言增加ajax验证码功能
增加ajax功能模块,用户不点击提交按钮,只要输入框失去焦点,就会提前提示验证码是否正确。 一,模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...
html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
ZYNQ学习记录FPGA(一)ZYNQ简介
一、知识准备 1.一些术语,缩写和概念: 1)ZYNQ全称:ZYNQ7000 All Pgrammable SoC 2)SoC:system on chips(片上系统),对比集成电路的SoB(system on board) 3)ARM:处理器…...
小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
核心速览 研究背景 研究问题:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...
