Java:Lambda表达式、方法引用

文章目录

    • 1、Lambda表达式
      • 1.1 Lambda表达式体验
      • 1.2 Lambda表达式的省略形式
      • 1.3 Lambda表达式练习
    • 2、方法引用体验
    • 3、方法引用符
    • 4、引用静态方法
    • 5、引用对象的实例方法
    • 6、引用类的实例方法
    • 7、引用构造方法
    • 8、引用数组的构造方法
    • 9、方法引用练习
      • 9.1 练习1
      • 9.2 练习2
      • 9.3 练习3
    • 10、方法引用总结

学习方法引用之前先学匿名内部类和Lambda表达式。以下代码基于JDK11编写。

1、Lambda表达式

函数式编程:忽略面向对象的复杂语法,强调做什么,而不是谁去做。
函数式接口:有且只有一个抽象方法的接口叫做函数式接口,接口上方可加@Functioonalinterface

Lambda表达式的基本作用:用来简化匿名内部类的书写,Lambda表达式只能简化函数式接口的匿名内部类的写法。

Lambda表达式有什么使用前提:必须是接口的匿名内部类,接口中只能有一个抽象方法。

Lambda的好处:Lambda是一个匿名函数,可以把Lambda表达式理解为是一段可以传递的代码,它可以写出更简洁、更灵活的代码,作为一种更紧凑的代码风格,使Java语言表达能力得到了提升。

Lambda表达式语法:() -> {}

  • ():形参
  • ->:固定格式
  • {}:方法的方法体

1.1 Lambda表达式体验

public class LambdaDemo01 {public static void main(String[] args) {/***  1.利用匿名内部类的形式去调用下面的方法(以前的调用方式)*  调用一个方法的时候,如果方法的形参是一个接口,那么我们要传递这个接口的实现类对象*  如果实现类对象只要用到一次,就可以用匿名内部类的形式进行书写*/method(new Swiming() {@Overridepublic void swim() {System.out.println("正在游泳-这是匿名内部类方式");}});/***  2.利用Lambda表达式的形式去调用下面的方法*/method(() ->{System.out.println("正在游泳-这是Lambda表达式格式");});}public static void method(Swiming s){s.swim();}
}// 这里即使不写@Functioonalinterface也是函数式接口,因为接口中只有一个抽象方法
interface Swiming{void swim();
}

image-20231226143352488

1.2 Lambda表达式的省略形式

  • 参数类型可以省略不写。
  • 如果只有一个参数,参数类型可以省略,同时()也可以省略。
  • 如果Lambda表达式的方法体只有一行,大括号,分号,return可以省略不写,需要同时省略。
public class LambdaDemo02 {public static void main(String[] args) {// 需求:降序排序Integer[] arr = {10, 2, 5, 1, 4, 3, 6, 7, 8, 9};System.out.println("------------Lambda表达式完整格式----------");//Lambda表达式完整格式Arrays.sort(arr,(Integer o1, Integer o2) -> {
//            return o1 - o2; //升序排序return o2-o1;  //降序排序});System.out.println(Arrays.toString(arr));System.out.println("------------Lambda表达式省略格式----------");/*** Lambda表达式省略写法* 如果Lambda表达式的方法体只有一行,大括号,分号,return可以省略不写,需要同时省略*/Arrays.sort(arr,((o1, o2) -> o2-o1));System.out.println(Arrays.toString(arr));}
}

image-20231226144524263

1.3 Lambda表达式练习

需求:定义数组并存储一些字符串,利用Arrays中的sort方法进行排序

思路:按照字符串长度排序,短的在前,长的在后,不比较里面的内容。

public class LambdaDemo03 {public static void main(String[] args) {//需求:定义数组并存储一些字符串,利用Arrays中的sort方法进行排序//思路:按照字符串长度排序,短的在前,长的在后,不比较里面的内容String[] strings = {"abc","a","ab","123abc","123","abab","aaaaaaaa","aaaaa"};System.out.println("------------Lambda表达式完整格式(升序)----------");Arrays.sort(strings,(String o1, String o2) ->{return o1.length() - o2.length();});System.out.println(Arrays.toString(strings));System.out.println("------------Lambda表达式省略格式(倒叙)----------");Arrays.sort(strings,((o1, o2) -> o2.length() - o1.length()));System.out.println(Arrays.toString(strings));}
}

image-20231226145347566

2、方法引用体验

(1)方法引用的出现原因

在使用Lambda表达式的时候,我们实际上传递进去的代码就是一种解决方案:拿参数做操作

那么考虑一种情况:如果我们在Lambda中所指定的操作方案,已经有地方存在相同方案,那是否还有必要再写重复逻辑呢?答案肯定是没有必要。

那我们又是如何使用已经存在的方案的呢?这就是我们要讲解的方法引用,我们是通过方法引用来使用已经存在的方案。

(2)方法引用的使用条件

  • 被引用的方法需要已经存在,可以是Java已经写好的,也可以是一些第三方的工具类
  • 被引用方法的形参和返回值需要跟抽象方法的形参和返回值保持一致
  • 被引用方法的功能需要满足当前的要求

(3)代码演示

public class MethodReferenceDemo01 {public static void main(String[] args) {// 需求:创建一个数组,进行降序排列Integer[] arr = {3, 5, 4, 1, 6, 2};System.out.println("------------匿名内部类方式-----------");/*** 匿名内部类方式*/Arrays.sort(arr, new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o2-o1;}});System.out.println(Arrays.toString(arr));System.out.println("------------lambda表达式方式-----------");/*** lambda表达式方式* 因为第二个参数的类型Comparator是一个函数式接口,所以可以使用lambda表达式*/Arrays.sort(arr,(Integer o1,Integer o2) -> {return o2-o1;});System.out.println(Arrays.toString(arr));System.out.println("------------方法引用方式-----------");/*** 1.引用处需要是函数式接口* 2.被引用的方法需要已经存在* 3.被引用方法的形参和返回值需要跟抽象方法的形参和返回值保持一致* 4.被引用方法的功能需要满足当前的要求*/Arrays.sort(arr,MethodReferenceDemo01::subtraction);System.out.println(Arrays.toString(arr));}// 被引用的方法可以是Java已经写好的,也可以是一些第三方的工具类public static int subtraction(int num1, int num2) {return num2 - num1;}
}

image-20231226150950157

3、方法引用符

(1)方法引用符

:: 该符号为引用运算符,而它所在的表达式被称为方法引用

(2)推导与省略

  • 如果使用Lambda,那么根据“可推导就是可省略”的原则,无需指定参数类型,也无需指定的重载形式,它们都将被自动推导
  • 如果使用方法引用,也是同样可以根据上下文进行推导
  • 方法引用是Lambda的孪生兄弟

4、引用静态方法

引用类方法,其实就是引用类的静态方法

类方法(Class Method)是指使用 static 关键字修饰的方法。

(1)格式

类名::静态方法

(2)示例

Integer::parseInt

Integer类的方法:public static int parseInt(String s) 将此String转换为int类型数据

(3)练习描述

需求:集合中有以下数字,要求把他们都变成int类型
“1”,“2”,“3”,“4”,“5”

(4)代码演示

public class MethodReferenceDemo02 {public static void main(String[] args) {// 1.创建集合并添加元素ArrayList<String> list = new ArrayList<>();Collections.addAll(list,"1","2","3","4","5");// 2.把他们都变成int类型,使用map进行类型的转换(String->Integer)System.out.println("-----------匿名内部类方式------------");list.stream().map(new Function<String, Integer>() {@Overridepublic Integer apply(String s) {int i = Integer.parseInt(s);return i;}}).forEach(s-> System.out.println(s));System.out.println("-----------方法引用方式------------");list.stream().map(Integer::parseInt).forEach(s-> System.out.println(s));}
}

image-20231226152228386

使用说明:Lambda表达式被类方法替代的时候,它的形式参数全部传递给静态方法作为参数

5、引用对象的实例方法

引用对象的实例方法,其实就是引用类中的成员方法

成员方法包括实例方法和静态方法。

public class MyClass {
// 实例变量
private int myVariable;// 实例方法
public void instanceMethod() {// 这是一个实例方法,可以访问实例变量System.out.println("This is an instance method.");
}// 静态方法
public static void staticMethod() {// 这是一个静态方法,不能访问实例变量System.out.println("This is a static method.");
}
}

(1)格式
其他类:其他类对象::方法名
本类:this::方法名(引用处不能是静态方法)
父类:super::方法名(引用处不能是静态方法)

(2)示例

“HelloWorld”::toUpperCase

String类中的方法:public String toUpperCase() 将此String所有字符转换为大写

(3)练习描述

    需求:集合中有一些名字,按照要求过滤数据数据:"张无忌","周芷若","赵敏","张强","张三丰"要求:只要以张开头,而且名字是3个字的

(4)代码演示

其他类的成员方法

public class StringOperation {public boolean stringJudge(String s){return s.startsWith("张") && s.length() == 3;}
}

测试

public class MethodReferenceDemo03 {public static void main(String[] args) {//1.创建集合ArrayList<String> list = new ArrayList<>();//2.添加数据Collections.addAll(list,"张无忌","周芷若","赵敏","张强","张三丰");//3.过滤数据(只要以张开头,而且名字是3个字的)System.out.println("------------匿名内部类方式--------------");list.stream().filter(new Predicate<String>() {@Overridepublic boolean test(String s) {return s.startsWith("张")&&s.length() == 3;}}).forEach(s-> System.out.println(s));System.out.println("------------Lambda表达式方式--------------");list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s));System.out.println("------------方法引用方式:引用其他类的成员方法--------------");StringOperation so = new StringOperation();list.stream().filter(so::stringJudge).forEach(s -> System.out.println(s));System.out.println("------------方法引用方式:引用本类的成员方法-----------------");// 下面的这个代码在main中,main方法是静态的,而静态方法中是没有this的,// 所以会报错cannot be referenced from a static context
/*        list.stream().filter(this.stringJudge).forEach(s -> System.out.println(s));*/list.stream().filter(new MethodReferenceDemo03()::stringJudge).forEach(s -> System.out.println(s));}public boolean stringJudge(String s){return s.startsWith("张") && s.length() == 3;}
}

image-20231226155629278

使用说明:Lambda表达式被对象的实例方法替代的时候,它的形式参数全部传递给该方法作为参数

6、引用类的实例方法

引用类的实例方法,其实就是引用类中的成员方法

(1)格式

类名::成员方法

(2)示例

String::substring

public String substring(int beginIndex,int endIndex)

从beginIndex开始到endIndex结束,截取字符串。返回一个子串,子串的长度为endIndex-beginIndex

(3)练习描述

需求:合里面一些字符串,要求变成大写后进行输出

(4)代码演示

public class MethodReferenceDemo05 {public static void main(String[] args) {/*匿名内部类中的抽象方法形参的详解:第一个参数:表示被引用方法的调用者,决定了可以引用哪些类中的方法在Stream流当中,第一个参数一般都表示流里面的每一个数据。假设流里面的数据是字符串,那么使用这种方式进行方法引用,只能引用String这个类中的方法第二个参数到最后一个参数:跟被引用方法的形参保持一致,如果没有第二个参数,说明被引用的方法需要是无参的成员方法局限性:不能引用所有类中的成员方法。是跟抽象方法的第一个参数有关,这个参数是什么类型的,那么就只能引用这个类中的方法。*///1.创建集合对象ArrayList<String> list = new ArrayList<>();//2.添加数据Collections.addAll(list, "aaa", "bbb", "ccc", "ddd");//3.变成大写后进行输出,使用map进行转换System.out.println("------------匿名内部类方式--------------");list.stream().map(new Function<String, String>() {@Overridepublic String apply(String s) {return s.toUpperCase();}}).forEach(s -> System.out.println(s));System.out.println("------------方法引用方式-----------------");//拿着流里面的每一个数据,去调用String类中的toUpperCase方法,方法的返回值就是转换之后的结果。list.stream().map(String::toUpperCase).forEach(s -> System.out.println(s));}
}

image-20231226162724972

image-20231226162943730

image-20231226162650970

使用说明:Lambda表达式被类的实例方法替代的时候,第一个参数作为调用者,后面的参数全部传递给该方法作为参数。

7、引用构造方法

引用构造器,其实就是引用构造方法

(1)格式

类名::new

(2)示例

Student::new

(3)练习描述

需求:集合里面存储姓名和年龄,要求封装成Student对象并收集到List集合中

(4)代码演示

public class MethodReferenceDemo04 {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集合中,使用map进行类型转换(String --> Student)System.out.println("------------匿名内部类方式--------------");List<Student> newList = list.stream().map(new Function<String, Student>() {@Overridepublic Student apply(String s) {String[] arr = s.split(",");String name = arr[0];int age = Integer.parseInt(arr[1]);return new Student(name, age);}}).collect(Collectors.toList());System.out.println(newList);System.out.println("------------方法引用方式-----------------");List<Student> newList2 = list.stream().map(Student::new).collect(Collectors.toList());System.out.println(newList2);}
}

image-20231226160905777

使用说明:Lambda表达式被构造器替代的时候,它的形式参数全部传递给构造器作为参数。

8、引用数组的构造方法

(1)格式

数据类型[]::new

(2)示例

int[]::new

(3)目的

创建一个指定类型的数组

(4)练习描述

需求:集合中存储一些整数,收集到数组当中
细节:数组的类型,需要跟流中数据的类型保持一致。

(5)代码演示

public class MethodReferenceDemo06 {public static void main(String[] args) {//1.创建集合并添加元素ArrayList<Integer> list = new ArrayList<>();Collections.addAll(list, 1, 2, 3, 4, 5);//2.收集到数组当中System.out.println("------------匿名内部类方式--------------");Integer[] arr = list.stream().toArray(new IntFunction<Integer[]>() {@Overridepublic Integer[] apply(int value) {return new Integer[value];}});System.out.println(Arrays.toString(arr));System.out.println("------------方法引用方式-----------------");Integer[] arr2 = list.stream().toArray(Integer[]::new);System.out.println(Arrays.toString(arr2));}
}

image-20231226165916374

9、方法引用练习

9.1 练习1

需求:集合中存储一些字符串的数据,比如:张三,23。收集到Student类型的数组当中

代码实现

public class MethodReferenceDemo07 {public static void main(String[] args) {//1.创建集合并添加元素ArrayList<String> list = new ArrayList<>();Collections.addAll(list, "张无忌,15", "周芷若,14", "赵敏,13", "张强,20", "张三丰,100", "张翠山,40", "张良,35", "王二麻子,37", "谢广坤,41");//2.先把字符串变成Student对象,然后再把Student对象收集起来// map之后,流里的数据已经变为Student了,所以toArray要转为Student类型的数组Student[] arr = list.stream().map(Student::new).toArray(Student[]::new);// 打印数组System.out.println(Arrays.toString(arr));}
}

image-20231226171004234

9.2 练习2

需求:创建集合添加学生对象学生对象属性:name,age
要求:获取姓名并放到数组当中使用方法引用完成
技巧:1.现在有没有一个方法符合我当前的需求2.如果有这样的方法,这个方法是否满足引用的规则静态   类名::方法名成员方法构造方法  类名::new

代码实现

public class MethodReferenceDemo08 {public static void main(String[] args) {// 1.创建集合ArrayList<Student> list = new ArrayList<>();// 2.添加元素list.add(new Student("zhangsan",23));list.add(new Student("lisi",24));list.add(new Student("wangwu",25));// 3.获取姓名放到数组当中System.out.println("------------匿名内部类方式--------------");String[] arr = list.stream().map(new Function<Student, String>() {@Overridepublic String apply(Student student) {return student.getName();}}).toArray(String[]::new);System.out.println(Arrays.toString(arr));System.out.println("------------方法引用方式-----------------");String[] arr2 = list.stream().map(Student::getName).toArray(String[]::new);System.out.println(Arrays.toString(arr2));}
}

image-20231226172306598

9.3 练习3

需求:创建集合添加学生对象学生对象属性:name,age
要求:把姓名和年龄拼接成:张三-23的字符串,并放到数组当中使用方法引用完成

代码实现

public class MethodReferenceDemo09 {public static void main(String[] args) {ArrayList<Student> studentList = new ArrayList<>();studentList.add(new Student("zhangsan",23));studentList.add(new Student("lisi",24));studentList.add(new Student("wangwu",25));// 使用方法引用将姓名和年龄拼接成字符串并放到数组中String[] nameAgeArray = studentList.stream().map(student -> student.getName() + "-" + student.getAge()).toArray(String[]::new);// 打印结果for (String nameAge : nameAgeArray) {System.out.println(nameAge);}}
}

image-20231226173917992

10、方法引用总结

1.什么是方法引用?
把已经存在的方法拿过来用,当做函数式接口中抽象方法的方法体
2.::是什么符号?
方法引用符
3.方法引用时要注意什么?
- 要使用方法引用的,需要是函数式接口
- 被引用方法必须已经存在
- 被引用方法的形参和返回值需要跟抽象方法保持一致
- 被引用方法的功能要满足当前的需求3.引用静态方法
类名::静态方法4.引用对象的实例方法	(可以引用所有类中的成员方法,与【5.】不同)
对象名::成员方法	(引用任意一个类的成员方法,要求形参和返回值要一样)
ths::成员方法	(引用本类的成员方法,只能写在非静态方法中,静态方法可以使用类名::成员方法)
super::成员方法		(引用父类的成员方法,只能写在非静态方法中,静态方法可以使用类名::成员方法)5.引用类的实例方法
类名::成员方法  (被引用的方法形参是跟抽象方法第二个参数后面的保持一致)
注:不能引用所有类中的成员方法,如果抽象方法的第一个参数是A类型的,只能引用A类中的方法。6.引用构造方法
类名::new7.引用数组的构造方法
数据类型[]::new

使用类名引用实例方法的参数对应解释:

image-20231226113258838

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

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

相关文章

优势演员-评论家算法 A2C

优势演员-评论家算法 A2C 优势演员-评论家算法 A2C主要思想目标函数 优势演员-评论家算法 A2C 前置知识&#xff1a;演员-评论家算法&#xff1a;多智能体强化学习核心框架 主要思想 AC 网络结构&#xff1a; 策略网络 - 演员: 这个网络负责根据当前的状态选择动作。它输出的是…

leetcode——杨辉三角

https://leetcode.cn/problems/pascals-triangle/ 杨辉三角&#xff1a; 给定一个非负整数 numRows&#xff0c;生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 核心思想&#xff1a;找出杨辉三角的规律&#xff0c;发…

案例098:基于微信小程序的电子购物系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

Apache Paimon:Streaming Lakehouse is Coming

摘要&#xff1a;本文整理自阿里云智能开源表存储负责人&#xff0c;Founder of Paimon&#xff0c;Flink PMC 成员李劲松&#xff08;花名&#xff1a;之信&#xff09;、同程旅行大数据专家&#xff0c;Apache Hudi & Paimon Contributor 吴祥平、汽车之家大数据计算平台…

前置判断-Detection

检测模型回答存在幻觉可以通过检索外部知识进行校验&#xff0c;不过考虑生成式模型覆盖问题的广泛性&#xff0c;Self-Contradictory论文中评估chatgpt生成的回答中38.5%的内容无法通过Wiki等外部知识进行校验。 因此这里我们先介绍一种完全基于模型自身&#xff0c;不依赖外…

多线程第一课---

UML中规定的箭头方向是从子类指向父类。 关于这一点&#xff0c;按照以下方法去理解有助于大家记住这条规则。 在定义子类时需要通过extends关键字指定父类。因此&#xff0c; 子类一定要知道父类的定义&#xff0c;而反过来&#xff0c;父类并不知道子类的定义。 只有在知道对…

51单片机串行口相关知识

51单片机串行口相关知识 串行通信概念 计算机与外部通信方式就两种&#xff1a; 并行通信串行通信 两种通信方式的特点以及适用场景&#xff1a; 名称特点适用场景并行通信速度快&#xff0c;效率高&#xff0c;成本高适合短距离高速通信&#xff0c;如计算机内部各硬件之…

基于日照时数计算逐日太阳辐射

基于日照时数计算逐日太阳辐射

ubuntu 2020 配置root用户直接登录

一、前言 ubuntu出于安全性的考虑&#xff0c;禁止root用户直接登录。不仅体现在ssh协议上&#xff0c;还有其图形化页面root用户直接登录时也无法直接登录。博主处于特殊的使用场景需要开启root用户直接登录&#xff0c;故进行下面配置&#xff0c;一般情况下不建议开启此配置…

【SpringCloud】之远程消费(进阶使用)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringCloud开发之远程消费》。&#x1f3af;&a…

C++ 类的内存分布

文章目录 1 . 前言2 . 无继承&#xff0c;无虚函数3 . 无继承&#xff0c;有虚函数4 . 单一继承&#xff0c;无虚函数5 . 单一继承&#xff0c;有虚函数&#xff0c;虚析构6 . 多重继承7 . 菱形继承8 . 虚拟继承9 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_…

淘宝京东1688商品详情API接口,搜索商品列表接口

前言 在实际工作中&#xff0c;我们需要经常跟第三方平台打交道&#xff0c;可能会对接第三方平台API接口&#xff0c;或者提供API接口给第三方平台调用。 那么问题来了&#xff0c;如果设计一个优雅的API接口&#xff0c;能够满足&#xff1a;安全性、可重复调用、稳定性、好…

vue-video-player播放hls视频流

需求 最近需要接入海康视频摄像头&#xff0c;然后把视频的画面接入到自己的网站系统中。以前对接过rtsp固定IP的显示视频&#xff0c;这次的不一样&#xff0c;没有了固定IP。海康的解决办法是&#xff0c;摄像头通过配置服务器到萤石云平台&#xff0c;然后购买企业版账号和…

Window端口占用处理

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精…

智能语音机器人NXCallbot

受出海公司业务全球化的影响&#xff0c;智能客服逐渐从便捷应用变为市场刚需。新基建七大领域中&#xff0c;人工智能及场景应用的基础建设是最核心的领域&#xff0c;而智能客服作为商业化实际应用的核心场景之一&#xff0c;能提升企业运营效率&#xff0c;为行业客户赋能。…

目标检测-One Stage-RetinaNet

文章目录 前言一、RetinaNet的网络结构和流程二、RetinaNet的创新点Balanced Cross EntropyFocal Loss 总结 前言 根据前文目标检测-One Stage-YOLOv2可以看出YOLOv2的速度和精度都有相当程度的提升&#xff0c;但是One Stage目标检测模型仍存在一个很大的问题&#xff1a; 前…

ARM NEON 指令

NEON指令 按照操作数类型可以分为正常指令、宽指令、窄指令、饱和指令、长指令。 正常指令&#xff1a;生成大小相同且类型通常与操作数向量相同到结果向量。长指令&#xff1a;对双字向量操作数执行运算&#xff0c;生产四字向量到结果。所生成的元素一般是操作数元素宽度到…

ReentrantLock底层原理学习一

J.U.C 简介 Java.util.concurrent 是在并发编程中比较常用的工具类&#xff0c;里面包含很多用来在并发场景中使用的组件。比如线程池、阻塞队列、计时器、同步器、并发集合等等。并发包的作者是大名鼎鼎的 Doug Lea。我们在接下来的课程中&#xff0c;回去剖析一些经典的比较…

vite4项目中,vant兼容750适配

一般非vite项目&#xff0c;使用postcss-px-to-viewport。在设计稿为750时候&#xff0c;可使用以下配置兼容vant。 在vite4项目中&#xff0c;以上配置不行。需要调整下&#xff0c;使用postcss-px-to-viewport-8-plugin&#xff0c;并修改viewportWidth&#xff0c;具体如下…

CSS新增文本样式(完整)

文本样式 概念&#xff1a;在CSS3中&#xff0c;增加了丰富的文本修饰效果&#xff0c;使得页面更加美观舒服。 常用的文本样式属性 属性说明text-shadow文本阴影text-stroke文本描边text-align-last文本对齐white-space处理空白字符text-overflow文本溢出word-wrap | word-…