isEmpty()方法:判断字符串是否为空:
- Java String 类中 isEmpty() 方法判断字符串的长度是否为空,如果字符串长度为 0,则返回 true,否则返回 false。
- 语法:
isEmpty()
示例 :使用 isEmpty() 函数获取字符串 strCom 的值,将返回值赋给 boolean 变量 str。
String strCom = "I like java!"; //定义一个字符串
boolean str = strCom.isEmpty(); //判断字符串是否为空
currentTimeMillis()方法:
currentTimeMillis()方法返回一个long类型的值,该值表示的是当前时间与1970年1月1日0时0分0秒之间的时间差,单位是毫秒,习惯上被称为时间戳。接下来通过一个案例来计算进行循环操作时所需要的时间。
public class Main{
public static void main(String[] args)throws Exception{
long startTime=System.currentTimeMillis(); //定义循环开始前的时间
int sum=0;
for(long i=0;i<100000000;i++){
sum=1;
}
long endTime=System.currentTimeMillis(); //定义循环结束后的时间
System.out.println("程序运行时间为:"+(endTime-startTime)+"毫秒");
}
}
案例中在循环开始及结束时分别定义了时间戳,两个时间戳的差值就是循环操作耗费的时间。
request.setCharacterEncoding(“UTF-8”); :的作用是设置对客户端请求进行重新编码的编码。
ConvertToJson( );
ConvertToJson(Value, [Whitespace]) {String}
Value-{Variant}Dictionary, Collection, 或 Array 转换为字符串
Whitespace-{Integer|String} 具有给定数量的空格或每个缩进的字符串的美观输出
转换Dictionary, Collection, 或者 Array为JSON 字符串.
CollectionUtils.isEmpty
集合判断:
例1: 判断集合是否为空:
CollectionUtils.isEmpty(null): true
CollectionUtils.isEmpty(new ArrayList()): true
CollectionUtils.isEmpty({a,b}): false
例2: 判断集合是否不为空:
CollectionUtils.isNotEmpty(null): false
CollectionUtils.isNotEmpty(new ArrayList()): false
CollectionUtils.isNotEmpty({a,b}): true
contains( ) 和 equals () 方法的区别
-
功能不同
equals指示其他某个对象是否与此对象“相等”。
contains当且仅当此字符串包含指定的 char 值序列时,返回 true。 -
用法不同
equals实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。
contains常用与集合中判断某个对象是否含有这个元素。 -
含义不同
equals是比较两个东西是否等同,适用于任何类别的对象。
contains是是否包含的意思,左边的对象是一个容器了。
request.getHeader( );
获得浏览器请求头中的User-Agent:
请求:
String userAgent = request.getHeader("user-agent");
StringUtils.isBlank()的使用
- 在校验一个String类型的变量是否为空时,通常存在3中情况
- 是否为 null
- 是否为 “”
- 是否为空字符串(引号中间有空格) 如: " "。
- StringUtils的isBlank()方法可以一次性校验这三种情况,返回值都是true。
Zuul中RequestContext.setSendZuulResponse
ZuulFilter中的RequestContext.setSendZuulResponse这个方法在几乎每个教程中都会有涉及,但是大多数教程都没有讲清楚其作用,只是一句"ctx.setSendZuulResponse(false) 表示不进行路由",其具体意思不太明白,后来经过尝试发现,将其设为false代表的意思是,这个请求最终不会被zuul转发到后端服务器,但是如果当前Filter后面还存在其他Filter,那么其他Filter仍然会被调用到,所以一般我们在Filter的shouldFilter方法中,都会通过
@Override
public boolean shouldFilter() {
RequestContext ctx = RequestContext.getCurrentContext();
if(!ctx.sendZuulResponse()){
return false;
}
}
这样的方法来做判断,如果这个请求最终被拦截掉,则后面的过滤器逻辑也不需要执行了
转载:https://blog.csdn.net/zgyjk/article/details/81672830
Map工具-MapUtil
MapUtil是针对Map的一一列工具方法的封装,包括getXXX的快捷值转换方法。
**方法: **
isEmpty、isNotEmpty
判断Map为空和非空方法,空的定义为null或没有值newHashMap
快速创建多种类型的HashMap实例createMap
创建自定义的Map类型的Mapof
此方法将一个或多个键值对加入到一个新建的Map中,下面是例子 :
Map<Object,Object> colorMap =MapUtil.of(newString[][]{
{"RED","#FF0000"},
{"GREEN","#00FF00"},
{"BLUE","#0000FF"}
});
toListMap
行转列,合并相同的键,值合并为列表,将Map列表中相同key的值组成列表做为Map的value,例如传入数据是:
[
{a:1, b:1, c:1}
{a:2, b:2}
{a:3, b:3}
{a:4}
]
- 结果为:
{
a:[1,2,3,4]
b:[1,2,3,]
c:[1]
}
toMapList
列转行。将Map中值列表分别按照其位置与key组成新的map,例如传入数据:
{
a:[1,2,3,4]
b:[1,2,3,]
c:[1]
}
- 结果为:
[
{a:1, b:1, c:1}
{a:2, b:2}
{a:3, b:3}
{a:4}
]
join、joinIgnoreNull
将Map按照给定的分隔符转换为字符串filter
过滤过程通过传入的Editor实现来返回需要的元素内容,这个Editor实现可以实现以下功能:1、过滤出需要的对象,如果返回null表示这个元素对象抛弃 2、修改元素对象,返回集合中为修改后的对象reverse Map
的键和值互换sort
排序MapgetAny
获取Map的部分key生成新的Mapget、getXXX
获取Map中指定类型的值
Aop的基本概念
- Advice(通知,切面):某个连接点所采用的处理逻辑,也就是向连接点注入的代码,AOP在特定的切入点上执行的增强处理.
1.1 @Before: 标识一个前置增强方法,相当于BeforeAdvice的功能.
1.2 @After :final增强,不管是抛出异常或者正确退出都会执行
1.3 @AfterReturning: 后置增强,似于AfterReturningAdvice, 方法正常退出时执行.
1.4 @AfterThrowing: 异常抛出增强,相当于ThrowsAdvice.
1.5 @Around: 环绕增强,相当于MethodInterceptor. - JointPoint(连接点):程序运行中的某个阶段点,比如方法的调用、异常的抛出等。
- Pointcut(切入点): JoinPoint的集合,是程序中需要注入Advice的位置的集合,指明Advice要在什么样的条件下才能被触发,在程序中主要体现为书写切入点表达式。
- Advisor(增强): 是PointCut和Advice的综合体,完整描述了一个advice将会在pointcut所定义的位置被触发。
- @Aspect(切面): 通常是一个类的注解,里面可以定义切入点和通知
- AOP Proxy:AOP框架创建的对象,代理就是目标对象的加强。Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类。
<aop:aspectj-autoproxy/>
<aop:config proxy-target-class="true">
<aop:pointcut id="servicePointcut"
expression="execution(* com.cpic..*Service.*(..))" />
<aop:advisor pointcut-ref="servicePointcut" advice-ref="txAdvice"
order="3" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="list*" read-only="true" />
<!-- log方法会启动一个新事务 -->
<tx:method name="log*" propagation="REQUIRES_NEW"
isolation="READ_COMMITTED" />
</tx:attributes>
</tx:advice>
//OK所以一个Spring增强(advisor)=切面(advice)+切入点(PointCut)
- Pointcut
表示式(expression)和签名(signature)
//Pointcut表示式
@Pointcut("execution(* com.savage.aop.MessageSender.*(..))")
//Point签名
private void log(){}
- 由下列方式来定义或者通过 &&、 ||、 !、 的方式进行组合:
- execution:用于匹配方法执行的连接点;
- within:用于匹配指定类型内的方法执行;
- this:用于匹配当前AOP代理对象类型的执行方法;注意是AOP代理对象的类型匹配,这样就可能包括引入接口也类型匹配;
- target:用于匹配当前目标对象类型的执行方法;注意是目标对象的类型匹配,这样就不包括引入接口也类型匹配;
- args:用于匹配当前执行的方法传入的参数为指定类型的执行方法;
- @within:用于匹配所以持有指定注解类型内的方法;
- @target:用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解;
- @args:用于匹配当前执行的方法传入的参数持有指定注解的执行;
- @annotation:用于匹配当前执行方法持有指定注解的方法;
格式 :
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
- 其中后面跟着“?”的是可选项括号中各个pattern分别表示:
- 修饰符匹配(modifier-pattern?)
- 返回值匹配(ret-type-pattern): 可以为*表示任何返回值, 全路径的类名等
- 类路径匹配(declaring-type-pattern?)
- 方法名匹配(name-pattern):可以指定方法名 或者 代表所有, set 代表以set开头的所有方法
- 参数匹配((param-pattern)):可以指定具体的参数类型,多个参数间用“,”隔开,各个参数也可以用"" 来表示匹配任意类型的参数,"…"表示零个或多个任意参数。
如(String)表示匹配一个String参数的方法;(,String) 表示匹配有两个参数的方法,第一个参数可以是任意类型,而第二个参数是String类型。 - 异常类型匹配(throws-pattern?)
eg.
- 任意公共方法的执行:execution(public * *(…))
- 任何一个以“set”开始的方法的执行:execution(* set*(…))
- AccountService 接口的任意方法的执行:execution(* com.xyz.service.AccountService.*(…))
- 定义在service包里的任意方法的执行: execution(* com.xyz.service…(…))
- 定义在service包和所有子包里的任意类的任意方法的执行:execution(* com.xyz.service….(…))
第一个表示匹配任意的方法返回值, …(两个点)表示零个或多个,第一个…表示service包及其子包,第二个表示所有类, 第三个*表示所有方法,第二个…表示方法的任意参数个数 - 定义在pointcutexp包和所有子包里的JoinPointObjP2类的任意方法的执行:execution(* com.test.spring.aop.pointcutexp…JoinPointObjP2.*(…))")
- pointcutexp包里的任意类: within(com.test.spring.aop.pointcutexp.*)
- pointcutexp包和所有子包里的任意类:within(com.test.spring.aop.pointcutexp…*)
- 实现了Intf接口的所有类,如果Intf不是接口,限定Intf单个类:this(com.test.spring.aop.pointcutexp.Intf)
- 当一个实现了接口的类被AOP的时候,用getBean方法必须cast为接口类型,不能为该类的类型
- 带有@Transactional标注的所有类的任意方法:
@within(org.springframework.transaction.annotation.Transactional)
@target(org.springframework.transaction.annotation.Transactional) - 带有@Transactional标注的任意方法:@annotation(org.springframework.transaction.annotation.Transactional)
@within和@target针对类的注解,@annotation是针对方法的注解 - 参数带有@Transactional标注的方法:@args(org.springframework.transaction.annotation.Transactional)
- 参数为String类型(运行是决定)的方法: args(String)
ThreadLocal
https://baijiahao.baidu.com/s?id=1653790035315010634&wfr=spider&for=pc
JAVA 8 ‘::’ 关键字
- :: 关键字提供了四种语法,可以直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,::关键字可以使语言更简洁,减少冗余代码。
- https://blog.csdn.net/weixin_42740530/article/details/104655470