自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(114)
  • 收藏
  • 关注

原创 一个草稿对对对

‘北京赛车’ order by item;= ‘北京赛车’ order by item。

2023-12-25 03:16:49 336

原创 对外接口签名生成方式

当某个系统对外部系统提供接口访问时,为提高接口请求安全性,往往会在接口访问时添加签名,当外部系统访问本系统签名验证成功时才能正常返回数据,一般接口提供方会与外部系统提前约定好,不同外部系统用 appKey 加以区分,并且不同 appKey 对应不同秘钥(secretKey)

2023-07-31 09:59:26 585

原创 JDK8-2-流(3)- 流操作(2)

例如筛选每种类型菜肴中最高卡路里的菜肴。

2023-06-19 17:28:16 92

原创 JDK8-2-流(2)- 流操作

上篇中简单介绍了什么是流以及使用流的好处,本篇主要介绍流的操作类型以及如何操作。

2023-06-18 11:40:51 231

原创 JDK8-2-流(2.3)- 流操作-reduce (归约)

reduce 可以把一个流中的元素组合起来,例如可以计算一组数的总和。

2023-06-18 11:17:47 127

原创 JDK8-2-流(2.2)- 流操作-flatMap

flatMap (流的扁平化处理)

2023-06-16 11:45:39 117

原创 JDK8-2-流(2.1)- 流操作-distinct

注意:对象去重需要重写 equals 和 hashCode 方法(默认对象 equals 方法比较的是对象内存地址是否一致),由 distinct 内部具体实现类 java.util.stream.DistinctOps 可以看出这点。IDEA 如何自动生成 equals 和 hashCode 方法空白处右键选择 Generate 或者Alt + Ins 快捷键使用 filter 方法去重。

2023-06-15 12:08:08 202

原创 JDK8-2-流(1)-简介

流是Java API的新成员,它允许你以声明性方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现),可以把它们看成遍历数据集的高级迭代器。此外,流还可以透明地并行处理,你无需写任何多线程代码!

2023-06-14 11:49:54 483

原创 JDK8-1-Lambda表达式(5)-复合 Lambda 表达式

Function<?super T,?@Override@Override相当于 Comparator.comparing 帮我们实例化一个 Comparator ,这个方法入参为 Functionreversed。

2023-06-10 17:19:58 736

原创 JDK8-1-Lambda表达式(4)-方法引用

下例中,date 为 Date 类型的对象,supplier 接收的 Lambda 表达式方法体中返回时间戳。

2023-06-09 13:50:11 40

原创 JDK8-1-Lambda表达式(3)-函数式接口

有且仅有一个抽象方法的接口称为函数式接口,中接口就是一个函数式接口,Java 8中引入的函数式接口定义在 java.util.function 包下。

2023-06-09 11:46:05 526

原创 JDK8-1-Lambda表达式(2)-方法传递(行为参数化)

Java 8 允许程序将方法作为参数传递,先看一个例子:以下,filterGreenApples ,filterHeavyApples 方法分别表示过滤出不同类型的苹果从代码中可以看出,filterGreenApples 与 filterHeavyApples 方法代码几乎一模一样,仅仅只有 if 条件中的代码有区别,既然这样为什么不可以将筛选的代码抽出,过滤的部分作为公共逻辑呢。

2023-06-07 17:25:10 918

原创 JDK8-1-Lambda表达式(1)-简介

Lambda也称为匿名函数,是 JDK8 的新特性之一,它允许程序将方法作为值传递(类似JS中的回调方法),相比 JDK8 之前的代码,Lambda语法更简洁。::是Java 8中的方法引用语法(即“把这个方法作为值”)将其传给listFiles方法。

2023-06-07 16:44:57 33

原创 2-Zookeeper单机版安装

本文介绍的是 Linux 系统下 Zookeeper 安装方式。

2023-05-14 17:07:04 386 1

原创 1-Zookeeper简介

ZooKeeper 是分布式应用程序的分布式开源协调服务。它公开了一组简单的原语,分布式应用程序可以基于这些原语实现更高级别的同步、配置维护、组和命名服务。它被设计为易于编程,并使用一种数据模型,该模型以熟悉的文件系统目录树结构为风格。它在 Java 中运行,并具有 Java 和 C 的绑定。众所周知,协调服务很难做好。它们特别容易出现竞争条件和死锁等错误。ZooKeeper 背后的动机是减轻分布式应用程序从头开始实现协调服务的责任。设计目标。

2023-05-14 15:51:24 445

原创 1-Linux环境安装JDK

本文中Linux环境为 CentOS Linux 7。

2023-05-13 18:41:11 517

原创 JavaSE-线程池(5)- ThreadPoolExecutor常用方法

ExecutorService 接口中定义的方法,给定一组任务,在所有任务执行完成时返回一个 Futures 列表,其中包含它们的状态和结果。

2023-02-27 16:51:08 260

原创 JavaSE-线程池(6)- 建议使用的方式

虽然JDK Executors 工具类提供了,但一般建议自定义线程池参数,下面是阿里巴巴开发手册给出的理由:另外Spring也提供了线程池的实现,比如 ThreadPoolExecutor。

2023-02-19 21:52:20 770

原创 JavaSE-线程池(4)- JDK Executors提供的创建线程池的方法

该线程池只有一个线程处理任务如下例:有8个任务被该线程池处理每个任务都是顺序执行的。

2023-02-18 13:19:25 298

原创 JavaSE-线程池(2)- 线程池参数

在上篇中提到创建线程池可以使用工具类中的静态方法,比如使用方法可以创建一个拥有固定线程数的线城池,这个方法内部实例化了线程池中保留的最少线程数量,除非调用 ThreadPoolExecutor 实例方法 allowCoreThreadTimeOut(true),否则即使核心线程空闲也不会被回收线程池中允许的最大线程数超过corePoolSize 数量的非核心线程在终止之前等待的最大时长当核心线程处于非空闲状态并且有新的任务提交时,线程池会将这些任务放入等待队列中。

2023-02-15 23:31:36 125

原创 JavaSE-线程池(3)- 线程池参数-拒绝策略

实现 RejectedExecutionHandler 接口即可,在 rejectedExecution 方法中可以记录没被处理的任务日志,也可以记录到消息队列中。

2023-02-15 23:30:32 107

原创 JavaSE-线程池(1)- 线程池概念

实现 ExecutorService 接口,提供ExecutorService执行方法的默认实现。

2023-02-11 17:55:24 668

原创 JDK8-11-CompletableFuture(9)- handle 方法使用

下例中,有一个计算除法的方法 divisionOperation,在main 方法中有两次调用,第一次正常调用,第二次产生异常,

2022-10-29 16:53:34 222

原创 JDK8-11-CompletableFuture(7)- thenApply,thenApplyAsync方法使用

回到顾客点餐,厨师炒菜打饭的例子:1.顾客进入餐厅2.顾客开始点餐3.厨师按照顾客所选菜品开始炒菜4.厨师打饭(假设没有服务员)5.顾客开始吃饭。

2022-10-23 12:33:13 1569 1

原创 JDK8-11-CompletableFuture(8)- applyToEither 方法使用

906路公交与539公交同时行驶在路上,没有先后顺序,906路耗时 5000,539路耗时4000,显然539路先到达,最终 busCF.join 返回结果为 “539路公交”,可见。方法作用是返回两个任务中最先完成的任务结果。

2022-10-23 11:56:57 689

原创 JDK8-11-CompletableFuture(6)- thenCombine方法使用

假设顾客进入餐馆的时间比较早,直到顾客点完餐后才开始煮饭,场景步骤如下(/ 表示同时进行):1.顾客进入餐厅2.顾客开始点餐3.厨师按照顾客所选菜品开始炒菜 / 4.服务员煮饭 / 5.顾客玩手机6.顾客等饭菜做好后开始吃饭用程序模拟如下:使用两个异步任务 chefCF ,waiterCF 分别处理炒菜和煮饭这两个动作,使用 chefCF.get(), waiterCF.get() 等待任务执行完成。

2022-10-16 20:34:15 477

原创 JDK8-11-CompletableFuture(5)- thenCompose 方法使用

Compose 意思为组成,thenCompose 意思为一个任务执行完后再执行下一个任务,thenCompose方法接收的入参为 Function,Function入参为上一个任务的结果(即dish),出参为 CompletionStage 的子类,此例中为 CompletableFuture。虽然这种写法可以完成本例的工作,但是代码存在嵌套,而且 CompletableFuture 已经提供API用来连接两个异步任务。如下所示,厨师和服务员的工作分为两个线程执行。3.厨师按照顾客所选菜品开始炒菜。

2022-10-16 18:10:00 785

原创 JDK8-11-CompletableFuture(4)- supplyAsync 方法使用

生活中有一些多线程的例子,例如顾客去餐馆点餐,大致可以分为如下几个步骤:1.顾客进入餐厅2.顾客开始点餐3.厨师按照顾客所选菜品开始炒菜4.厨师打饭(假设没有服务员)5.顾客开始吃饭,用于模拟耗时和打印当前时间戳和线程信息从执行结果中可以看出,main线程处理顾客相关动作,ForkJoinPool.commonPool-worker-1 线程处理厨师相关动作,从时间戳可以看出顾客玩手机和厨师开始炒菜都是1665891660537 ,符合异步处理场景。

2022-10-16 13:16:25 876

原创 JDK8-11-CompletableFuture(3)- 异常处理,completeExceptionally使用(如何让主线程捕获其他线程产生的异常)

运行结果:注意看,由于传入空名称的产品,程序产生异常,产生异常的线程名为 Thread-0,而程序并没有结束,主线程任然阻塞在 get 方法这里,如果不进行其他处理,程序会一直阻塞。

2022-10-16 11:08:18 3335

原创 JDK8-11-CompletableFuture(2)- CompletableFuture基本用法

同步调用测试方法,主线程首先调用 Shop getPrice 方法获取商品价格,然后再去做耗时 500 ms 的其他事情。如下,主线程异步处理商品计算逻辑,不立即获取结果,然后再开始做其他事情(耗时500 ms),等这件事处理完后再获取商品结果,同步调用的测试结果如下,由于计算商品价格 1000 ms,做其他事情 500 ms,所以总的耗时 1500 ms 左右。如下,整个过程耗时 1148 ms,明显异步处理要比同步处理耗时要少。:店铺中具体计算价格的方法,sleep 1秒,模拟耗时。

2022-10-14 21:42:47 531

原创 JDK8-11-CompletableFuture(1)

由图可知 main线程 首先提交异步任务,然后执行本线程的任务(doSomethingElse ),当main线程任务执行完后,使用get方法获取异步线程执行结果,此时 异步任务 doSomeLongComputation 还未执行完成,所以 main 线程会阻塞,直到异步任务结果返回或者超时此例引用自 Java 8 实战11.1。

2022-10-11 23:11:58 152

原创 JDK8-10-Optional(1)

显然这种方式也不好,return “” 同一段代码出现次数太多,

2022-08-27 17:17:39 133

原创 cURL 工具使用

cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。()在某些受限的情况(比如本地机器无法与目标ip连通)下无法使用 postman 等可视化工具发送网络请求,此时可以使用curl工具代替。

2022-08-20 23:05:06 299

原创 设计模式 -(19)模板方法模式(Template Method Pattern)

设计模式 -(19)模板方法模式(Template Method Pattern)前言举一些生活中的例子:去银行办理业务会经历以下步骤:1.取号、2.排队、3.办理具体业务、4.给服务评分,其中在第三步中有的人办理存款,有的人办理取款,有的人办理贷款,在这个步骤中不同的人处理的事情不一样,而除了这个步骤以外其他步骤都一样做菜时一般都经历 去皮, 洗菜,切菜,烹饪等步骤,其中去皮,洗菜,切菜操作大同小异,而烹饪时则需要根据不同菜品调整不同的烹饪方式,如鱼可以清蒸,肉可以小炒,骨头用来炖汤以上举的

2022-05-30 16:24:04 83

原创 设计模式 -(7)观察者模式/发布订阅模式(observer pattern)

设计模式 -(7)观察者模式/发布订阅模式(observer pattern)前言生活中有一些这样的例子:行人在过斑马线时会观察交通信号灯,当亮红灯时停止等待,当亮绿灯时过马路老师在黑白板书,学生在讲台下做笔记用户订阅某个公众号,当公众号发布消息时订阅的用户可以收到对应消息在上面的例子中,信号灯可以理解为被观察者(observable),行人为观察者(observer),行人观察信号灯状态,状态改变时做出相应的行为反应,同样学生观察老师,当老师板书后,学生做笔记,观察者模式在生活中应用广泛,

2022-05-27 22:54:10 70

原创 设计模式 -(6)责任链模式(Chain Of Responsibility pattern)

设计模式 -(6)责任链模式(Chain Of Responsibility pattern)前言之前做过一个这样的需求:在客户办理业务时对客户信息进行校验,如黑名单校验,坏账校验,如果校验失败则不允许客户继续办理业务。针对这种情况,首先想到的便是直接在一个方法中完成所有的校验,比如:public String check(){ if(校验黑名单失败){ return "客户在黑名单中!"; } if(校验坏账失败){ return "客户存在

2022-05-27 14:20:31 101

原创 设计模式 -(13)建造者模式(builder pattern)

设计模式 -(13)建造者模式(builder pattern)在 java 中创建对象一般使用 new Class () ,但在某些情况下类定义者并不想将类的实例化直接暴露给使用者,这种情况下我们可以通过工厂模式实例化对象,不过此篇文章分析的是另一种创建对象和使用对象分离的设计模式,建造者模式如下:Person 类可以理解成产品,而内部类 PersonBuilder 可以理解成生成产品的建造者public class Person { private String name; pr

2022-05-25 09:52:29 111

原创 设计模式 -(3)工厂模式(factory pattern)

设计模式 -(3)工厂模式(factory pattern)通常我们需要某个类的对象时,通过 new Class 的方式即可,但是通过工厂模式可以屏蔽创建对象的过程,具体细节交给工厂方法即可。简单工厂模式如下,有一个汽车接口 Car :public interface Car { void printName();}目前有奥迪和宝马两种汽车:public class Audi implements Car{ @Override public void printNa

2022-05-24 18:02:58 98

原创 设计模式 -(2)策略模式(strategy pattern)

设计模式 -(2)策略模式(strategy pattern)生活中有这样一些场景,例如在网购时,对于同一件商品,普通买家需要全额购买,而会员则可以打折后购买,同样的事情两者的应对策略却不同,策略可以理解成同一事情在不同场景下的不同应对措施同样,我们在编程过程中也会遇到类似的情况,例如有一个类表示企业员工,其中有工号和年龄两个属性,现在有一个场景需要根据工号id对两个不同的员工对象进行比较排序:public class Employee { private int empNo; p

2022-05-22 18:21:28 149

原创 设计模式 -(1)单例模式(singleton pattern)

单例模式可以简单理解为让某个类的某个对象称为系统中的唯一对象饿汉式饿汉式的意思是不管程序是否会用到这个类的对象都会初始化一个此类的对象,如下例,这种模式将类对象作为类的静态成员变量,而类的静态成员变量在类加载的时候就初始化完成了(具体可见:.class 加载过程),这样便可以保证程序在获取类实例时返回的都是同一个实例/** * 饿汉式 * 类加载到内存后,就实例化一个单例,JVM保证线程安全 * 推荐使用 * 唯一缺点,不管是否用到与否,类装载时就完成了实例化 */public class

2022-05-21 18:51:02 129

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除