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

Java8特性-Lambda表达式

📕概述

        在Java 8中引入了Lambda表达式作为一项重要的语言特性,可以堪称是一种语法糖。Lambda表达式使得以函数式编程的方式解决问题变得更加简洁和便捷。

Lambda表达式的语法如下:

(parameters) -> expression
(参数) -> {代码}

        其中,parameters是Lambda表达式的参数列表,可以是零个或多个参数,如果有多个参数,用逗号分隔;expression是Lambda表达式的函数体,可以是一个表达式或一段语句块。

❗使用Lambda表达式的条件

  1. 函数式接口:Lambda表达式只能用于函数式接口(Functional Interface)的实现。函数式接口是指只包含一个抽象方法的接口。函数式接口可以使用@FunctionalInterface注解显式声明,但这并非必要,只要满足函数式接口的特征即可。

  2. 上下文匹配:Lambda表达式必须与上下文(Context)相匹配,即Lambda表达式的参数和返回类型必须与目标上下文的参数和返回类型相匹配。例如,Lambda表达式可以作为方法的参数或赋值给一个接口类型的变量。

📕Lambda表达式

以下是一个简单的Lambda表达式的示例:

//Lambda表达式作为匿名函数实现两个数相加
MathOperation addition = (int a,int b) -> a+b;
int result = addition.operation(2,3);//结果为5

        在这个示例中,我们定义了一个MathOperation接口,并使用Lambda表达式作为接口的实现。Lambda表达式接受两个整数参数ab,并返回它们的和。

🏷例1

public class LambdaTest {public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {System.out.println("线程开始");                }}).start();}
}

使用Lambda表达式实现就是这样子的:

public class LambdaTest {public static void main(String[] args) {new Thread(() -> System.out.println("线程开始")).start();}
}

🏷例2

public class LambdaTest {public static void main(String[] args) {int b = calculateNum(new IntBinaryOperator() {@Overridepublic int applyAsInt(int left, int right) {return left + right;}});System.out.println(b);}public static int calculateNum(IntBinaryOperator operator){int a = 10;int b = 20;return operator.applyAsInt(a,b);}
}

使用Lambda表达式就是这个样子的:

public class LambdaTest {public static void main(String[] args) {int b = calculateNum((left, right) -> left + right);System.out.println(b);}public static int calculateNum(IntBinaryOperator operator){int a = 10;int b = 20;return operator.applyAsInt(a,b);}
}

        还差那么点意思是吧🤭,因为啥,因为return是吧,为啥掉了呢,其实没有掉,你把left+right改成{return left+right}试试,那肯定是不会报错的,left+right是表达式,加个return就是语句了,所以需要加上{}包裹着。你再看,和左边去掉之后有没有哪里不一样。 

        这里说明:注意使用Lambda表达式的前提吼,Lambda表达它不需要知道你接口名,也不需要知道你的接口内的方法名,但是哦,可得记住,这个接口内只能有一个抽象方法,那么我们就可以直接把不需要的东西去掉,简化后的代码就是Lambda表达式,但是这个时候你如果安装了idea的一些插件,他可能会提示你说还可以转换成Lambda更简化的表达式,不要着急,咱们慢慢来来!

🏷例3

public class LambdaTest {public static void main(String[] args) {printNum(new IntPredicate() {@Overridepublic boolean test(int value) {return value%2==0;}});}public static void printNum(IntPredicate intPredicate){int[] arr = {1,2,3,4,5,6,7,8,9};for (int i : arr) {if(intPredicate.test(i)){System.out.println(i);}}}
}

改为Lambda表达式:

public class LambdaTest2 {public static void main(String[] args) {printNum((int value) ->{return value%2==0;});}public static void printNum(IntPredicate intPredicate){int[] arr = {1,2,3,4,5,6,7,8,9};for (int i : arr) {if(intPredicate.test(i)){System.out.println(i);}}}
}

就这么简单,不用怀疑,就是这么简单,但是这还不是最简化的形式。

🏷例4

🆗,例子到此结束,这四个例子可以看出,转换Lambda表达式,接口名和方法名我们no care,我们只关注这个参数。咱们继续 👇

📕转换Lambda表达式简化规则

  1. 参数类型可以省略
  2. 方法体只有一句代码时,大括号return和唯一一句代码的分号可以省略
  3. 方法只有一个参数时小括号可以省略
  4. 以上这些规则都记不住也可以省略不记(因为IDEA有快捷键可以实现)Alt+Enter

 我们看上面说到的最后一个例子:简化的前提是,先转换成Lambda表达式再简化

这其实就和右边的一样了 。

当然还有更简化的方式啊,就是简化Integer.valueOf(str)为Integer::valueOf,这个是为什么呢?

        在Java中,Integer.valueof是调用静态方法的一种方式。它表示调用Integer类的valueof方法,将一个基本类型的整数值转换为对应的Integer对象。

        而Integer::valueof则是Java 8引入的方法引用(Method Reference)的语法。它也表示调用Integer类的valueof方法,并且可以作为Lambda表达式的替代形式使用。相当于把方法引用包装成一个函数接口。

        因此,Integer.valueofInteger::valueof的作用是完全相同的,只是语法上的不同而已。它们都用于将基本类型的整数值转换为对应的Integer对象。

那么类似这样的,都可以转换:

byte by = 10;
Byte byteObj = Byte.valueOf(by); // 将byte类型的值转换为Byte对象short sh = 100;
Short shortObj = Short.valueOf(sh); // 将short类型的值转换为Short对象int i = 1000;
Integer intObj = Integer.valueOf(i); // 将int类型的值转换为Integer对象long l = 1000000L;
Long longObj = Long.valueOf(l); // 将long类型的值转换为Long对象float f = 3.14f;
Float floatObj = Float.valueOf(f); // 将float类型的值转换为Float对象double d = 1.4142135;
Double doubleObj = Double.valueOf(d); // 将double类型的值转换为Double对象

 如果这种不会转换,那就用快捷键吧。

📕Stream流

 🏷准备工作

/*** @author 小白程序员* @Classname Author* @Description TODO干啥呢* @date 2023/9/3 17:39*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode //后期去重的使用
public class Author {private Long id;private String name;private Integer age;private String intro;private List<Book> books;
}/*** @author 小白程序员* @Classname Book* @Description TODO干啥呢* @date 2023/9/3 17:41*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
public class Book {private Long id;private String name;private String category;private Integer score;private String intro;
}/*** @author 小白程序员* @Classname BookService* @Description TODO干啥呢* @date 2023/9/3 17:43*/
public class BookService {public static void main(String[] args) {//后面的代码都写在这一块的来测试}private static List<Author> getAuthors() {Author author = new Author(1L, "蒙多", 17, "一个祖安人", null);Author author2 = new Author(2L, "亚拉索", 18, "艾欧尼亚", null);Author author3 = new Author(3L, "易大师", 19, "黑色玫瑰", null);Author author4 = new Author(3L, "易大师", 19, "黑色玫瑰", null);List<Book> book1 = new ArrayList<>();List<Book> book2 = new ArrayList<>();List<Book> book3 = new ArrayList<>();List<Book> book4 = new ArrayList<>();book1.add(new Book(1L,"*","哲学,爱情", 80, "*"));book1.add(new Book(2L,"**","爱情,个人成长", 80, "**"));book2.add(new Book(3L,"***","爱情,传记", 70, "***"));book2.add(new Book(3L,"****","个人成长,传记", 70, "****"));book2.add(new Book(4L,"*****","哲学", 70, "*****"));book3.add(new Book(5L,"******","个人成长", 60, "******"));book3.add(new Book(6L,"*******","传记", 60, "*******"));book3.add(new Book(6L,"********","爱情", 60, "********"));book4.add(new Book(5L,"******","个人成长", 60, "******"));book4.add(new Book(6L,"*******","个人成长,传记,爱情", 60, "*******"));book4.add(new Book(6L,"********","哲学,爱情,个人成长", 60, "********"));author.setBooks(book1);author2.setBooks(book2);author3.setBooks(book3);author4.setBooks(book4);List<Author> authors = new ArrayList<>(Arrays.asList(author,author2,author3,author4));return authors;}
}

🏷案例分析

案例:获取年龄小于18的作家

public static void main(String[] args) {//查询出年龄小于18的作家的名字List<Author> authors = getAuthors();authors.stream().distinct().filter(new Predicate<Author>() {@Overridepublic boolean test(Author author) {return author.getAge() < 18;}}).forEach(new Consumer<Author>() {@Overridepublic void accept(Author author) {System.out.println(author.getName());}});
}//Lambda表达式优化
public static void main(String[] args) {//查询出年龄小于18的作家的名字List<Author> authors = getAuthors();authors.stream().distinct().filter(author -> author.getAge() < 18).forEach(author -> System.out.println(author.getName()));}

解释说明一下:authors.stream()是把集合转换成流形式,.distinct()是去重,.filter()是过滤,.forEach()是循环输出。

 🏷常用操作

🔖创建流

①单例集合:集合对象.stream()
List<Integer> list = new ArrayList<>();
Stream<Integer> stream = list.stream();
②数组:Arrays.stream(数组)或Stream.of(数组)来创建
Integer[] arr = {1,2,3,4};
Stream<Integer> stream1 = Arrays.stream(arr);
Stream<Integer> stream2 = Stream.of(arr);
③双例集合:转换成单例集合再创建
Map<String, String> map = new HashMap<>();
Stream<Map.Entry<String, String>> stream3 = map.entrySet().stream();

🔖中间操作

①filter

对流中的元素进行条件过滤,符合过滤条件的才能继续留在流中。

public static void main(String[] args) {//查询出年龄小于18的作家的名字List<Author> authors = getAuthors();authors.stream().distinct().filter(author -> author.getAge() < 18)//中间操作.forEach(author -> System.out.println(author.getName()));//终结操作}
②map

可以把流中的元素进行计算或转换。

public static void main(String[] args) {List<Author> authors = getAuthors();authors.stream().map(new Function<Author, String>() {//泛型中,第一个参数为方法的参数类型(流中的类型),第二个参数为方法的返回值类型@Overridepublic String apply(Author author) {return author.getName();}}).forEach(new Consumer<String>() {@Overridepublic void accept(String name) {System.out.println(name);}});
}//Lambda表达式优化public static void main(String[] args) {List<Author> authors = getAuthors();//泛型中,第一个参数为方法的参数类型(流中的类型),第二个参数为方法的返回值类型authors.stream().map(author -> author.getName()).forEach(name -> System.out.println(name));}

由此可以看出,Lambda表达式是有多么简化代码。

计算使用

public static void test() {List<Author> authors = getAuthors();//泛型中,第一个参数为方法的参数类型,第二个参数为方法的返回值类型authors.stream().map(author -> author.getAge()).map(age -> age+10).forEach(age -> System.out.println(age));
}
③distinct

去除流中重复的元素。

❗distinct方法是依赖Object类中的equals方法来判断是否是相同对象,所以需要重写equals方法

④sorted

对流中的元素进行排序

👍调用sorted()空参方法

在比较的实体类上要实现Comparable接口,不然会报类型不匹配的异常。

@Data
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode //后期去重的使用
public class Author implements Comparable<Author>{private Long id;private String name;private Integer age;private String intro;private List<Book> books;@Overridepublic int compareTo(Author o) {return this.getAge()-o.getAge();}
}
public static void test2(){List<Author> authors = getAuthors();authors.stream().distinct().sorted().forEach(author -> System.out.println(author.getName()));}

这里sorted内没有参数是因为在实体类中定义了比较的方式,所以不用传递参数。

👍在sorted方法中实现Comparator接口

        首先把Author中实现的东西去掉,用Lambda表达式方式写比较条件。sorted()方法中的new Comparator<T>是一个函数式接口,内部只有一个和compare抽象方法。

public static void test3() {List<Author> authors = getAuthors();authors.stream().distinct().sorted(new Comparator<Author>() {@Overridepublic int compare(Author o1, Author o2) {return o1.getAge()-o2.getAge();}}).forEach(author -> System.out.println(author.getAge()));
}

优化 

public static void test3(){List<Author> authors = getAuthors();authors.stream().distinct().sorted(((o1, o2) -> o2.getAge()- o1.getAge())).forEach(author -> System.out.println(author.getAge()));}
⑤limit

可以设置流的最大长度,超出的部分将被抛弃。

public static void test4(){List<Author> authors = getAuthors();authors.stream().distinct().sorted(((o1, o2) -> o2.getAge()- o1.getAge())).limit(2).forEach(System.out::println);}
⑥skip

跳过流中的前N个元素,返回剩下的元素。

⑦flatMap

map方式:map只能把一个对象转换成另一个对象来作为流中的元素。而flatMap可以把一个对象转换成多个对象作为流中的元素。

案例:打印所有书籍,要求对重复的元素进行去重。

map方式:Author对象的books属性是集合类型,使用原来map转换对象,要使用嵌套循环进行打印。

public static void test5() {List<Author> authors = getAuthors();authors.stream().map(Author::getBooks).forEach(books -> {books.forEach(System.out::println);});}

 flatMap方式:

public static void test6() {List<Author> authors = getAuthors();authors.stream().flatMap(author -> author.getBooks().stream()).forEach(System.out::println);}
案例二:打印现有数据的所有分类,要求对分类进行去重。不能出现这种格式:哲学,爱情,要将它们拆开输出。
public static void test7(){List<Author> authors = getAuthors();authors.stream().flatMap(author -> author.getBooks().stream()).distinct().flatMap(book -> Arrays.stream(book.getCategory().split(","))).distinct().forEach(System.out::println);}

🔖终结操作

①forEach

对流中的元素进行遍历操作,我们通过传入的参数去指定对遍历到的元素进行什么具体的操作。

②count

获取当前流中的元素个数。

public static void test8(){List<Author> authors = getAuthors();Long count = authors.stream().flatMap(author -> author.getBooks().stream()).distinct().count();System.out.println(count);}
③max&min

获取流中的最值

public static void test9(){List<Author> authors = getAuthors();Optional<Integer> max = authors.stream().flatMap(author -> author.getBooks().stream()).map(Book::getScore).max(((o1, o2) -> o2-o1));Optional<Integer> min = authors.stream().flatMap(author -> author.getBooks().stream()).map(Book::getScore).max(((o1, o2) -> o1-o2));System.out.println(max);System.out.println(min);}
④collect

把当前流的元素转换成一个集合

//获取一个存放所有作者名字的list集合
public static void test5() {List<Author> authors = getAuthors();List<String> nameList = authors.stream().map(author -> author.getName()).collect(Collectors.toList());System.out.println(nameList);
}

list集合、set集合、map集合都是类似的

注意map的是两个参数哦:collect(Collectors.toMap(author -> author.getName(), author -> author.getBooks()))

⑤查找与匹配

(1)anyMatch:判断是否有任意符合匹配条件的元素,结果为Boolean类型。

public static void test9(){List<Author> authors = getAuthors();boolean flag = authors.stream().anyMatch(author -> author.getAge()>18);System.out.println(flag);}

(2)allMatch:判断是否都符合条件,如果都符合返回true,否则返回false

public static void test10(){List<Author> authors = getAuthors();boolean b = authors.stream().allMatch(author -> author.getAge() > 18);System.out.println(b);}

(3)noneMatch:判断流中的元素是否都不符合匹配条件,如果都不符合结果为true,否则为false

(4)findAny:获取流中的任意一个元素,该方法没有办法保证获取到的一定是流中的第一个元素。

public static void test11(){//获取任意一个年龄大于18的作家List<Author> authors = getAuthors();Optional<Author> any = authors.stream().filter(author -> author.getAge() > 50).findAny();//如果这个Optional中有元素,则执行方法,没有就不执行any.ifPresent(System.out::println);}

(5)findFirst:获取流中的第一个元素

public static void test12(){//获取一个年龄最小的作家List<Author> authors = getAuthors();Optional<Author> firstOne = authors.stream().sorted((o1, o2) -> o1.getAge() - o2.getAge()).findFirst();firstOne.ifPresent(System.out::println);}

(6)reduce归并:对流中的数据按照指定的计算方式计算出一个结果

reduce的作用是把Stream中的元素给组合起来,我们可以传入一个初始值,它会按照我们的计算方式一次拿流中的元素和初始值进行计算,计算结果再和后面的元素计算。

它内部的计算方式如下:

T result = identity;
for (T element : this stream)result = accumulator.apply(result, element)
return result;

其中identity就是我们可以通过方法参数传入的初始值,accumulator的apply具体进行什么计算也是我们通过方法参数来确定的。

案例1:使用reduce求所有作者年龄的和

public static void test13(){List<Author> authors = getAuthors();Integer sum = authors.stream().distinct().map(Author::getAge).reduce(0,(result,element) -> result + element);System.out.println(sum);}

案例2:使用reduce求所有作者中年龄的最大值

public static void test14(){List<Author> authors = getAuthors();Integer max = authors.stream().map(Author::getAge).reduce(Integer.MIN_VALUE,(result,element) -> result > element ? result : element);System.out.println(max);}

reduce有个重载形式,内部代码如下:

boolean foundAny = false;
T result = null;
for (T element : this stream) {if(!foundAny) {foundAny = true;result = element;} else {result = accumulator.apply(result, element);}
}
return foundAny ? Optional.of(result) : Optional.empty();

利用这个重载形式,求作者年龄的最大值,不用传递初始值了。

public static void test8() {List<Author> authors = getAuthors();Optional<Integer> max = authors.stream().map(author -> author.getAge()).reduce((result, element) -> result > element ? result : element);System.out.println(max.get());
}

❗惰性求值:如果没有终结操作,中间操作是不会得到执行的。

❗流是一次性的:一旦一个流对象经过一个终结操作后,这个流就不能在被使用了,只能重新创建流对象再使用。

❗不会影响原数据:我们在流中可以对数据做很多处理,但正常情况下是不会影响原来集合中的元素的。

相关文章:

Java8特性-Lambda表达式

&#x1f4d5;概述 在Java 8中引入了Lambda表达式作为一项重要的语言特性&#xff0c;可以堪称是一种语法糖。Lambda表达式使得以函数式编程的方式解决问题变得更加简洁和便捷。 Lambda表达式的语法如下&#xff1a; (parameters) -> expression (参数) -> {代码}其中&…...

通过Power Platform自定义D365CE业务需求 - 1. Microsoft Power Apps 简介

Microsoft Power Apps是一个趋势性的、无代码和无代码的商业应用程序开发平台,配有一套应用程序、服务和连接器。其数据平台为构建适合任何业务需求的自定义业务应用程序提供了快速开发环境。随着无代码、少代码应用程序开发的引入,任何人都可以快速构建低代码应用程序,并与…...

简易实现QT中的virtualkeyboard及问题总结

文章目录 前言&#xff1a;一、虚拟键盘的实现综合代码 二、为什么选用QWidget而不适用QDialog实现键盘三、从窗体a拉起窗体b后&#xff0c;窗体b闪退问题的探讨四、关闭主窗口时子窗口未关闭的问题 前言&#xff1a; 本文章主要包含四部分&#xff1a; 虚拟键盘的实现&#…...

景联文科技可为多模态语音翻译模型提供数据采集支持

8月22日Facebook的母公司Meta Platforms发布了一种能够翻译和转录数十种语言的人工智能模型——SeamlessM4T&#xff0c;可以在日常生活中或者商务交流中为用户提供更便捷的翻译和转录服务。 相较于传统的文本翻译&#xff0c;这项技术的最大区别在于它可以实现端到端的语音翻译…...

定时器分批请求数据

<!DOCTYPE html> <html><script>//需要分页的数组let arr [1,2,3,4,5,6,7,8,9,10]//分割数组&#xff0c;每页3条splitArr(arr,4)/*** 分割数组*/function splitArr(idList,size){//当前页数let num 1//共多少页let count Math.ceil(idList.length / siz…...

【华为OD机试python】报数游戏【2023 B卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 100个人围成一圈,每个人有一个编码,编号从1开始到100。 他们从1开始依次报数,报到为M的人自动退出圈圈,然后下一个人接着从1开始报数, 直到剩余的人数小于M。 请问最后剩余的人在原先…...

【深度学习实战—6】:基于Pytorch的血细胞图像分类(通用型图像分类程序)

✨博客主页&#xff1a;米开朗琪罗~&#x1f388; ✨博主爱好&#xff1a;羽毛球&#x1f3f8; ✨年轻人要&#xff1a;Living for the moment&#xff08;活在当下&#xff09;&#xff01;&#x1f4aa; &#x1f3c6;推荐专栏&#xff1a;【图像处理】【千锤百炼Python】【深…...

华清远见第六课程day4作业

仿照string类&#xff0c;完成myString 类 #include <iostream> #include <cstring>using namespace std;class myString{ private:char *str;int size; public:myString():size(10){str new char[size];strcpy(str,"");}myString(const char*s){size …...

【广州华锐互动】AR远程智慧巡检在化工行业中的应用

AR远程智慧巡检是一种基于增强现实技术的新型巡检方式&#xff0c;它可以利用虚拟信息和现实场景的结合&#xff0c;实现对设备、工艺流程等方面的实时监测和识别。在化工行业中&#xff0c;AR远程智慧巡检具有广泛的应用前景&#xff0c;可以提高生产效率和安全性。 一、设备巡…...

easyui-sidemenu 菜单 后台加载

前言 一个项目的功能较齐全&#xff0c;而齐全就预示着功能菜单比较长&#xff0c;但是现实中在不同的甲方使用中往往只需要摘取其中几项功能&#xff0c;所以就想到用配置菜单以满足其需求&#xff0c;且无需变更原始代码&#xff0c;查找一些资料总是似是而非或是誊抄别的什…...

Python总结上传图片到服务器并保存的两种方式

一、前言 图片保存到服务器的两种方法&#xff1a; 1、根据图片的 URL 将其保存到服务器的固定位置 2、根据 request.FILES.get("file") 方式从请求中获取上传的图片文件&#xff0c;并将其保存到服务器的固定位置 二、方法 1、图片的 URL 要根据图片的 URL 将…...

【ETH】以太坊合约智能合约逆向方案

技术角度了解区块链 区块链技术逆袭专栏 文章目录 区块链技术逆袭专栏获取合约代码逆向工具方案1方案2实操演示:获取合约代码 在反编译之前,你需要先知道如果获取编译后的字节码。 这里以 USDT 举例 eth.getCode(0xdAC17F958D2ee523a2206206994597C13D831ec7)字节码: 0x…...

C高级Day5

课后作业&#xff1a; rootlinux:~/shell# cat qh.sh #!/bin/bash function sum_array() {local brr($*) local sum0for i in ${brr[*]} dosum$((sum i))doneecho $sum } arr(1 2 3 4 5) result$(sum_array ${arr[*]}) echo "数组的和为: $result"#!/bin/bash fun…...

AI绘画:Midjourney超详细教程Al表情包超简单制作,内附关键词和变现方式

大家好&#xff0c;本篇文章主要介绍AI绘画完成表情包的制作和变现方式分享。 你还不会AI表情包制作吗&#xff1f;下面我们详细的拆解制作过程。跟着这个教程做出一套属于自己的表情包。 核心工具Midjourney PS&#xff0c;你就可以得到一套自己的专属表情包啦~ 整体制作…...

Linux dup dup2函数

/*#include <unistd.h>int dup2(int oldfd, int newfd);作用&#xff1a;重定向文件描述符oldfd 指向 a.txt, newfd 指向b.txt,调用函数之后&#xff0c;newfd和b.txt close&#xff0c;newfd指向a.txtoldfd必须是一个有效的文件描述符 */ #include <unistd.h> #i…...

设计模式系列-外观模式

一、上篇回顾 上篇我们主要讲述了创建型模式中的最后一个模式-原型模式&#xff0c;我们主要讲述了原型模式的几类实现方案&#xff0c;和原型模式的应用的场景和特点&#xff0c;原型模式 适合在哪些场景下使用呢&#xff1f;我们先来回顾一下我们上篇讲述的3个常用的场景。 1…...

DBeaver 下载、安装与数据库连接(MySQL)详细教程【超详细,保姆级教程!!!】

本文介绍DBeaver 下载、安装与数据库连接&#xff08;MySQL&#xff09;的详细教程 一、DBeaver 下载 官网下载地址&#xff1a;https://dbeaver.io/download/ 二、安装 1、双击下载的安装包&#xff0c;选择中文 2、点击下一步 3、点击我接受 4、如下勾选&#xff0c;…...

使用adjustText解决标签文字遮挡问题python

使用adjustText解决文字遮挡问题 1、一个例子2、adjust_text的用法使用pip install adjustText或conda install -c conda-forge adjusttext来安装adjustText。安装成功之后,首先生成随机示例数据以方便之后的演示: 1、一个例子 我们先不使用adjustText调整图像,直接绘制出原…...

[论文笔记]SiameseNet

引言 这是Learning Text Similarity with Siamese Recurrent Networks的论文笔记。 论文标题意思是利用孪生循环神经网络学习文本相似性。 什么是孪生神经网络呢?满足以下两个条件即可: 输入是成对的网络结构和参数共享(即同一个网络)如下图所示: 看到这种图要知道可能代…...

只有个体户执照,可以用来在抖音开店吗?抖店开通问题解答

我是王路飞。 在抖音开店的门槛&#xff0c;本身就是需要有营业执照的。 至于执照的类型&#xff0c;其实主要看商家自己。 如果你是新手商家&#xff0c;之前也没有怎么接触过电商行业&#xff0c;那么用个体执照在抖音开店足够用了&#xff0c;毕竟你要先入门&#xff0c;…...

微服务高可用容灾架构设计

导语 相对于过去单体或 SOA 架构&#xff0c;建设微服务架构所依赖的组件发生了改变&#xff0c;因此分析与设计高可用容灾架构方案的思路也随之改变&#xff0c;本文对微服务架构落地过程中的几种常见容灾高可用方案展开分析。 作者介绍 刘冠军 腾讯云中间件中心架构组负责…...

记录docker 部署nessus

1、开启容器 docker run -itd --nameramisec_nessus -p 8834:8834 ramisec/nessus 2、登录 &#xff1a;注意是https https://ip8843 3、修改admin密码 #进入容器 docker exec -it ramisec_nessus /bin/bash#列出用户名 /opt/nessus/sbin/nessuscli lsuser#修改密码&a…...

qt 正则表达式

以上是正则表达式的格式说明 以下是自己写的正则表达式 22-25行 是一种设置正则表达式的方式&#xff0c; 29-34行 : 29行 new一个正则表达式的过滤器对象 30行 正则表达式 的过滤格式 这个格式是0-321的任意数字都可以输入 31行 将过滤格式保存到过滤器对象里面 32行 将验…...

l8-d13 UNIX域套接字

一、UNIX 域流式套接字 本地地址 struct sockaddr_un { unsigned short sun_family; /* 协议类型 */ char sun_path[108]; /* 套接字文件路径 */ }; UNIX 域流式套接字的用法和 TCP 套接字基本一致&#xff0c;区别在于使用的协议和地址不同 UNIX 域流式套接字服务器…...

@RequiredArgsConstructor(onConstructor=@_(@Autowired))是什么语法?

这是 Lombok 语法糖写法。 在我们写controller或者Service层的时候&#xff0c;需要注入很多的mapper接口或者另外的service接口&#xff0c;这时候就会写很多的AutoWired注解 lombok提供注解&#xff1a; RequiredArgsConstructor(onConstructor __(Autowired))写在类上可以…...

FL Studio Producer Edition 21.0.3.3713中文完整破解版功能特点及安装激活教程

FL Studio Producer Edition 21.0.3.3713中文完整破解版是一款由Image Line公司研发几近完美的虚拟音乐工作站,同时也是知名的音乐制作软件。它让你的计算机就像是全功能的录音室&#xff0c;漂亮的大混音盘&#xff0c;先进的创作工具&#xff0c;让你的音乐突破想象力的限制。…...

Mybatis 动态语言 - mybatis-velocity

前面我们介绍了Mybatis动态SQL的使用&#xff1b;本篇我们介绍使用mybatis-velocity动态语言生成动态SQL。 如果您对Mybatis动态SQL不太了解&#xff0c;建议您先进行了解后再阅读本篇&#xff0c;可以参考&#xff1a; Mybatis 动态SQL – 使用if,where标签动态生成条件语句…...

Fourier傅里叶变换的线性性质和位移性质

Fourier傅里叶变换的线性性质和位移性质 为了阐述方便, 假定在这些性质中, 凡是需要求Fourier变换的函数都满足Fourier积分定理中的条件。在证明这些性质时, 不再重述这些条件。 一、线性性质 设 F 1 ( ω ) F [ f 1 ( t ) ] {F_1}(\omega ) {\mathscr F}[{f_1}(t)] F1​(…...

# 磁盘引导方式相关知识之BIOS、msdos、MBR、UEFI、gpt、esp、csm

磁盘引导方式相关知识之BIOS、msdos、MBR、UEFI、gpt、esp、csm 磁盘、分区、引导等知识经常似懂非懂&#xff0c;不能完全说清楚&#xff0c;梳理下&#xff1a; 序号主板芯片引导方式支持的磁盘分区表类型支持的磁盘分区表格式对应引导位置备注1BIOS传统方式&#xff08;俗…...

Java中同时POST文件和提交JSON数据的方法

一、引言 在Java中&#xff0c;可以使用java.net.URLConnection类来进行HTTP请求&#xff0c;并实现同时POST文件和提交JSON数据的功能。下面将通过一篇文章的形式为您详细讲解这个过程。 二、实现步骤 步骤一&#xff1a;导入所需的类库 首先&#xff0c;你需要导入以下类…...

搭建一个网站的服务器/中国宣布疫情结束日期

1. 对象/关系数据库映射&#xff08;ORM&#xff09; ORM 全称 Object/Relation Mapping&#xff1a;表示对象-关系映射的缩写 ORM 完成面向对象的编程语言到关系数据库的映射。当 ORM 框架完成映射后&#xff0c;程序员既可以利用面向对象程序设计语言的简单易用性&#xff…...

山东省住房城乡建设厅查询网站/企业管理系统

新建 ctrl n格式化 ctrlshiftf导入包 ctrlshifto 注释 ctrl/,ctrlshift/,ctrlshift\代码上下移动 选中代码alt上/下箭头查看源码 选中类名(F3或者Ctrl鼠标点击)查找具体的类 ctrl shift t查找具体类的具体方法 ctrl o给建议 ctrl1,根据右边生成左边的数据类型,生成方法删除…...

天睦和生态建设有限公司网站/推广平台免费b2b网站大全

搜索热词本文实例为大家分享了PHP实现统计代码行数小工具&#xff0c;供大家参考&#xff0c;具体内容如下为了方面统计编程代码行数&#xff0c;做了一个小工具。自动统计指定目录以及目录下的所有文件。class TotalCode {/*** 统计当前文件有多少行代码&#xff0c;* return …...

买网站去哪买/百度seo学院

一.请简述MySQL配置文件的加载顺序&#xff1f; 二.MySQL启动时如果找不到配置(参数)文件&#xff0c;会报错还是启动&#xff1f; 三.如何查看MySQL参数&#xff1f; 四.如何修改MySQL参数? 五&#xff1a;MySQL有哪些类型表空间&#xff0c;简述各自作用&#xff1f; 六&…...

深圳宝安住房和建设局网站官网/在线优化seo

咱们已经了解了如何将代码恢复至某一版本&#xff0c;但是通过Local History恢复代码有的时候并不方便&#xff0c;例如咱们将项目中的代码进行了多处修改&#xff0c;这时通过Local History恢复代码就显得很麻烦&#xff0c;因为它更倾向于恢复某一个文件的修改。 因此&#x…...

济南网站建设要多少钱/潍坊网站建设平台

线-小箭头&#xff0c;中间的线区分&#xff1a;->关联 &#xff1a;类中使用了对方的指针&#xff0c;或者引用--->依赖 &#xff1a;函数参数中使用了对方&#xff0c;指针方式或者引用方式&#xff0c;可以相互依赖。菱形-线-小箭头&#xff0c;开始端的菱形区分&…...