Git分支改名命令
1. 如果对于分支不是当前分支,可以使用下面的命令:
git branch -m "原分支名" "新分支名"
2. 如果是当前分支:
git branch -m "新分支名称"
Git分支改名命令
1. 如果对于分支不是当前分支,可以使用下面的命令:
git branch -m "原分支名" "新分支名"
2. 如果是当前分支:
git branch -m "新分支名称"
Stream 流中 Collectors.toMap 的用法
Collectors.toMap() 方法是把 List 转 Map 的操作
- public static void main(String[] args) {
- List<Student> list = Arrays.asList(
- new Student(1, "张三", 20, "29.8"),
- new Student(2, "李四", 25, "29.5"),
- new Student(3, "赵武", 23, "30.8"),
- new Student(4, "王六", 22, "31.8")
- );
-
- list 打印输出为:[
- Student(id=1, name=张三, age=20, score=29.8),
- Student(id=2, name=李四, age=25, score=29.5),
- Student(id=3, name=赵武, age=23, score=30.8),
- Student(id=4, name=王六, age=22, score=31.8)
- ]
-
-
/**
* id 作为 map 的key,name 作为 value
* 结果集: {1=张三, 2=李四, 3=赵武, 4=王六}
*/- Map<Integer, String> collect = list.stream()
- .collect(Collectors.toMap(Student::getId, Student::getName));
- System.out.println(collect);
-
-
/**
* id 作为 map 的 key,Student 对象作为 map 的 value
* 结果集: {1=Student(id=1, name=张三, age=20, score=29.8),
2=Student(id=2, name=李四, age=25, score=29.5),
3=Student(id=3, name=赵武, age=23, score=30.8),
4=Student(id=4, name=王六, age=22, score=31.8)}
*/- Map<Integer, Student> collect1 = list.stream()
- .collect(Collectors.toMap(Student::getId, v -> v));
- System.out.println(collect1);
-
-
/**
* id 作为 map 的 key,Student 对象作为 map 的 value
* 结果集: {1=Student(id=1, name=张三, age=20, score=29.8),
2=Student(id=2, name=李四, age=25, score=29.5),
3=Student(id=3, name=赵武, age=23, score=30.8),
4=Student(id=4, name=王六, age=22, score=31.8)}
*/- Map<Integer, Student> collect2 = list.stream()
- .collect(Collectors.toMap(Student::getId, Function.identity()));
- System.out.println(collect2);
- }
- String typeBanner = "A=1,B=2,C=3";
- String[] typeBannerArray = typeBanner.split(",");
- System.out.println(Arrays.toString(typeBannerArray)); // [A=1, B=2, C=3]
- Map<String, String> typeBannerMap = Arrays.stream(typeBannerArray).collect(Collectors.toMap(
- (array) -> array.split("=")[0],
- (array) -> array.split("=")[1]
- ));
- System.out.println(typeBannerMap); // {A=1, B=2, C=3}
按照规范来写的话,最好所有toMap,都要将这个异常提前考虑进去,不然有时候会报重复主键异常,这也是正例的写法,上面的属于反例的写法。
- toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper);
- toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,
- BinaryOperator<U> mergeFunction);
- toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper,
- BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier);
参数解释:
1. keyMapper:Key 的映射函数,Student:getId 表示选择 Student 的 getId 作为 map 的 key 值。
2. valueMapper:Value的映射函数,Function.identity() 表示选择将原来的对象作为 Map 的value 值。
3. mergeFunction:当 Key 冲突时,调用的合并方法。(n1,n2)->n1 中,如果 n1 与 n2 的 key 值相同,选择 n1 作为那个 key 所对应的 value 值。
4. mapSupplier:Map 构造器,在需要返回特定的 Map 时使用。第四个参数 mapSupplier 用于返回一个任意类型的 Map 实例,比如我们希望返回的 Map 是根据 Key 排序的。TreeMap::new
- public static void main(String[] args) {
- List<Student> list = Arrays.asList(
- new Student(1, "张三", 20, "29.8"),
- new Student(2, "李四", 25, "29.5"),
- new Student(1, "赵武", 23, "30.8"),
- new Student(4, "王六", 22, "31.8")
- );
- /**
- * id 作为 map 的key,重复 id 的 name 合并作为 value
- * 结果集: {1=张三,赵武, 2=李四, 4=王六}
- */
- Map<Integer, String> collect = list.stream()
- .collect(Collectors.toMap(Student::getId, Student::getName, (n1, n2) -> n1 +","+ n2));
- System.out.println(collect);
-
- /**
- * 取前面一个 Student 对象
- * 结果集: {1=Student(id=1, name=张三, age=20, score=29.8),
- 2=Student(id=2, name=李四, age=25, score=29.5),
- 4=Student(id=4, name=王六, age=22, score=31.8)}
- */
- Map<Integer, Student> collect1 = list.stream()
- .collect(Collectors.toMap(Student::getId, Function.identity(), (n1, n2) -> n1));
- System.out.println(collect1);
-
- /**
- * 取后面一个 Student 对象
- * 结果集: {1=Student(id=1, name=赵武, age=23, score=30.8),
- 2=Student(id=2, name=李四, age=25, score=29.5),
- 4=Student(id=4, name=王六, age=22, score=31.8)}
- */
- Map<Integer, Student> collect2 = list.stream()
- .collect(Collectors.toMap(Student::getId, Function.identity(), (n1, n2) -> n2, TreeMap::new));
- System.out.println(collect2);
- }
写案例遇到的问题有,上述第一个输出,如果写成 n1 + n2 ,map 第二个参数类型是对象或者是list集合,都是显示编译报错状态。
Java try catch 跳过了catch直接进入finally
css样式中的百分比都是相对于谁的?
width、height(正常定位)
width 和 height 的百分比是分别根据父级元素块的宽度和高度来计算的。
相对定位的 top、left
- position: relative;
- top: 100%;
- left: 100%;
top 和 left 的百分比是分别根据父级元素块的高度和宽度来计算的。
绝对定位的 top、left、width、height
- position: absolute;
- top: 50%;
- left: 50%;
-
- width: 100%;
- height: 100%;
top、height 和 left、width 的百分比是分别根据包含它的第一个不是 static 定位的元素的高度和宽度来计算的。
固定定位的 top、left
- position: fixed;
- top: 50%;
- left: 50%;
top 和 left 的百分比是分别根据浏览器视口的高度和宽度来计算的。
translate
transform: translate(-50%, -50%);
translate 是根据自身的宽高来计算的。
margin-top, margin-left,padding-top, padding-left
- margin-top: 50%;
- margin-left: 50%;
相对于父级元素块的宽度。
border-radius
border-radius: 50%;
相对于自身。
background-size
background-size: 100% 100%;
相对背景区的宽高。
CSS解决position:fixed基于父元素定位而不是浏览器窗口
众所周知fixed是基于浏览器窗口定位,但是今天遇到个问题,发现fixed并不一定是这样
有一个例外会使fixed是基于祖先元素定位。

<div class="container" style="transform:rotate(360deg);">
<div>
<div class="box" style="position:fixed;"></div>
</div>
</div>
el-table组件自带了一个transform属性

fixed不为元素预留空间,而是通过指定元素相对于屏幕视口(viewport)的位置来指定元素位置。元素的位置在屏幕滚动时不会改变。打印时,元素会出现在的每页的固定位置。fixed 属性会创建新的层叠上下文。当元素祖先的 transform 属性非 none 时,容器由视口改为该祖先。
(会产生副作用, 会影响其他的定位)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>1</title>
<style>
.test {
position: fixed;
left: 0;
right: 0;
bottom: 0;
width: 600px;
margin: 0 auto;
background-color: green;
}
</style>
</head>
<body>
<div class="test">22</div>
</body>
</html>
notepad++录制宏:删除整行
1. 菜单中的【宏】-【开始录制】springcloud @EnableDiscoveryClient注解作用
相信熟悉Spring Cloud的读者对注解@EnableDiscoveryClient 及@EnableEurekaClient 并不陌生。
要想将一个微服务注册到Eureka Server(或其他服务发现组件,例如Zookeeper、Consul等),Eureka 2.0闭源之后,Consul慢慢会成为主流。
只需:
添加Eureka Client(或其他服务发现组件的Client)依赖:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
写注解:在启动类上添加注解@EnableDiscoveryClient 或@EnableEurekaClient
@EnableDiscoveryClient
@SpringBootApplication
public class ProviderUserApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderUserApplication.class, args);
}
}
|
写配置:
spring:
application:
name: microservice-provider-user
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
|
从Spring Cloud Edgware开始,@EnableDiscoveryClient 或@EnableEurekaClient 可省略。只需加上相关依赖,并进行相应配置,即可将微服务注册到服务发现组件上。
@EnableDiscoveryClient和@EnableEurekaClient共同点就是:都是能够让注册中心能够发现,扫描到改服务。
不同点:@EnableEurekaClient只适用于Eureka作为注册中心,@EnableDiscoveryClient 可以是其他注册中心。
花5分钟过一遍jar包和war包的区别(概念,目录,使用和部署)
解决IDEA不能直接运行单个JAVA文件
IntelliJ IDEA配置JDK版本
css选择器 ~ (波浪号)、+(加号)、>(大于号)的用法解析和举例
IntelliJ IDEA 设置终端(Terminal) 打开时默认位置
打开设置: 在 IntelliJ IDEA 中,通过点击菜单栏的 File -> Settings (Windows/Linux) 或 IntelliJ IDEA -> Preferences (macOS)。
定位到 Terminal 设置: 在设置窗口中,找到 Tools -> Terminal。
修改启动目录: 在 Terminal 设置中,你可以找到一个选项 Start directory。如果你希望 Terminal 始终在当前项目的根目录打开,可以使用特定的宏来设置路径。例如:
$ProjectFileDir$,这样 Terminal 将会在你打开的项目根目录下启动。保存并关闭设置: 点击 OK 或 Apply 来保存你的设置。
unplugin-auto-import插件: vue3不用再写一堆import啦
Vue中import from的来源:省略后缀与加载文件夹
Vue使用import ... from ...来导入组件,库,变量等。而from后的来源可以是js,vue,json。这个是在webpack.base.conf.js中设置的:
- module.exports = {
- resolve: {
- extensions: ['.js', '.vue', '.json'],
- alias: {
- '@': resolve('src')
- }
- }
- ...
- }
这里的extensions指定了from后可导入的文件类型。
而上面定义的这3类可导入文件,js和vue是可以省略后缀的:
import test from './test.vue'
等同于:
import test from './test'
同理:
import test from './test.js'
等同于:
import test from './test'
json不可以省略后缀:
import test from './test.json'
省略为:
import test from './test'
则编译出错。
那么,若test.vue,test.js同时存在于同一个文件夹下,则import的导入优先级是:
js>vue
from后的来源除了文件,还可以是文件夹:
import test from './components'
该情况下的逻辑是:
- if(package.json存在 && package.main字段存在 && package.main指定的js存在) {
- 取package.main指定的js作为from的来源,即使该js可能格式或内容错误
- } else if(index.js存在){
- 取index.js作为from的来源
- } else {
- 取index.vue作为from的来源
- }
因此若from的来源是文件夹,那么在package.json存在且设置正确的情况下,会默认加载package.json;若不满足,则加载index.js;若不满足,则加载index.vue。
注意加载文件夹的形式,与上面省略后缀的形式是完全相同的。所以一个省略后缀的from来源,有可能是.vue,.js,或者文件夹。
例:
查看Vue-Element-Admin的源码,其中有个Layout.vue:

里面调用import导入了3个组件:
import { Navbar, Sidebar, AppMain } from './components'
这里,from的路径'./components'就是个文件夹。
于是,按照前面的规则,首先查看文件夹下是否有package.json:

并没有package.json。
package.json不存在,那么查找index.js。index.js是存在的,于是加载。
打开index.js:
export { default as Navbar } from './Navbar' export { default as Sidebar } from './Sidebar' export { default as AppMain } from './AppMain'html
可以看到3个export,都没有后缀,所以其类型vue,js和文件夹都是有可能的。
同一级目录下,存在AppMain.vue和Navbar.vue,没有同名js,所以可以判断出这两个都是加载的vue文件,即:
export { default as Navbar } from './Navbar.vue' export { default as AppMain } from './AppMain.vue'html
而Sidebar只有一个文件夹,所以是加载的文件夹。打开Sidebar文件夹:

优先找package.json。不存在。
然后找index.js,不存在。
最后找index.vue,存在。
于是:
export { default as Sidebar } from './Sidebar'
相当于:
export { default as Sidebar } from './Sidebar/index.vue'
这样,Layout.vue就通过加载一个文件夹,获得了3个vue组件。
element-plus更换主题色
省流版:
在App.vue中加入:
- <script setup>
- import { onMounted } from 'vue'
-
- onMounted(() => {
- document.body.style.setProperty('--el-color-primary', '#56AB2F');
- document.body.style.setProperty('--el-color-primary-light-9', '#F5FBF0');
- document.body.style.setProperty('--el-color-primary-light-3', '#95d475');
- })
- </script>
颜色可以自己自由更换。
踩坑日记:
最开始看官网上的方法,通过 SCSS 变量覆盖原来的主题色,但是我这经常报scss的错,明明我已经装了scss,实在找不到原因,于是放弃了;
之后试过在App.vue中直接:root重写--el-color-primary,但只是最开始有用,之后完全不起作用,于是也放弃了。
Vue2中:visible.sync 迁移到 Vue3 v-model