lombok
看看https://yq.aliyun.com/articles/59972
IDEA需要安装lombok插件。
用法:类上加上
@Data:相当于有了 get set 等多个方法;
@Builder: 传统的生成类的实例都是new个对象然后set属性值,类上加了@Builder后,就可以类似:
User user = User.builder()
.name("John")
.age(32)
.build();
Java一些用法:
**String.format()**方法的灵活运用。
判空:先判断null 再判断 isEmpty()
this关键字:它的类型是确定的,它所代表的对象只能是当前类的,只有当这个方法被调用时,它所代表的对象才被确定下来。谁在调用这个方法,this就代表谁。比如在其他地方调用某代码C时生成的对象,在代码执行时就代表着C中的this。
StringUtils:
StringUtils.isEmpty(String str) 判断某字符串是否为空,为空的标准是 str==null 或 str.length()==0;
StringUtils.isBlank(String str) 判断某字符串是否为空或长度为0或由空白符(whitespace) 构成
枚举类:
public enum QueryType {
TYPE_ACCOUNT("01"),
TYPE_PASSWORD("02");
private final String status;
QueryType(String status) {
this.status = status;
}
public String getStatus() {
return status;
}
}
易错点:
(1)在向List中添加对象时,如果仅仅是对对象的属性set ,实际加在List里的对象都是相同的,对同一对象的引用;所以必须先new一个对象,然后再加到List中。
还比如有个List,现在有一个地方用到它,如果之后执行list.clear(),那么之前引用的地方也会变成空的,所以不能用clear应该用重新new一个。
时间处理类:
import org.joda.time.DateTime;
Date date = new Date();
DateTime的构造参数可以为空,也可以是date
// 返回当前时间的当天起始时间就是零点,比如2018-08-01T00:00:00.000+08:00
new DateTime().withTimeAtStartOfDay()
new DateTime(date)
DateTime.now().minusDays(1).toString("yyyyMMdd")
如果想生成唯一的订单号?
析:可以考虑Java里的UUID类
/**
* @return 长度是32位的字符串
*/
public static String genBizId() {
String newBizIdUUID = UUID.randomUUID().toString();
return newBizIdUUID.substring(0, 8)
+ newBizIdUUID.substring(9, 13)
+ newBizIdUUID.substring(14, 18)
+ newBizIdUUID.substring(19, 23)
+ newBizIdUUID.substring(24);
}
如何在static方法中调用非static的属性?
析:可以借助类的一个对象,另外写一个方法
public class Test {
private String name="lisi";
public static String method1(Test test){
return test.name;
}
private static String method2(){
Test test = new Test();
return method1(test);
}
}
工具包的使用:
1、guava包,看个例子,
Map<String, String> map = ImmutableMap.<String,String>builder()
.put("name","lisi")
.put("age","30")
.build();
Map<String,String> map2 = Maps.newHashMap();
同理对于List和Set等也有对应的两种写法。
Immutable(不可变)集合
不可变集合,顾名思义就是说集合是不可被修改的。集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变。
为什么要用immutable对象?immutable对象有以下的优点:
1.对不可靠的客户代码库来说,它使用安全,可以在未受信任的类库中安全的使用这些对象
2.线程安全的:immutable对象在多线程下安全,没有竞态条件
3.不需要支持可变性, 可以尽量节省空间和时间的开销. 所有的不可变集合实现都比可变集合更加有效的利用内存 (analysis)
4.可以被使用为一个常量,并且期望在未来也是保持不变的
2、将List 转化为用逗号连接的String?
import com.google.common.base.Joiner;
List<String> list = new ArrayList();
list.add ....
String ss = Joiner.on(",").join(list);
3、List 拆分成以多少个为一组的List?
import org.apache.commons.collections4.ListUtils;
List<String> allList ;
List<List<String>> subListList=ListUtils.partition(allList,size); // size个为一组
JSON类:
import com.alibaba.fastjson.JSON;
怎样把json字符串转化为对应的类对象?
T t = JSON.parseObject(str, T.class);
怎样生成json字符串?
JSONObject jsonObject = new JSONObject();
jsonObject.put("source", "100");
。。。
jsonObject.toJSONString() // json字符串
Service和Controller类里的注释:
Service类里的方法需要在方法外加上对方法参数、方法用处等的注释,Controller类里的方法需要如下加上一些注释,例如:
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
@RequestMapping(value = "/lend", method = RequestMethod.GET)
@ApiOperation(value = "??", notes = "??")
@ApiImplicitParams({
@ApiImplicitParam(name = "applyId", paramType = "query", value = "??", dataType = "Long"),
@ApiImplicitParam(name = "type", paramType = "query", value = "??", dataType = "String")
})
// 注:ResponseObject是自定义的一个类,用来封装传输对象
public ResponseObject<...VO> doLend(@RequestParam Long applyId, @RequestParam String type) {
}
方法参数上实际加不加@RequestParam都可以获取到数据,有啥区别?是不是每次都要加上才好?
析:加上@RequestParam可以起到避免非空的判断。
Spring里用到:
1、在自己写的工具类里,static的方法如何引用Autowired的对象,使其不为null?
//别忘了这个注解
@Component
public class SmsUtil {
@Autowired
private SmsSender smsSender;
// 工具类的实例static对象
private static SmsUtil smsUtil;
// 被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次。
// 被@PostConstruct修饰的方法会在构造函数之后,init()方法之前运行。
@PostConstruct
private void init() {
smsUtil = this;
}
public static void someMethod(){
SmsSender sender = smsUtil.smsSender;
...调用即可
}
注:如果someMethod()不是static的,那么就简单了,就不需要SmsUtil smsUtil对象
以及init(),可以直接在someMethod()中引用this.smsSender
日志处理:
可以选择slf4j( 简单日志门面(Simple Logging Facade for Java))
例子:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogTest {
private static final Logger logger = LoggerFactory.getLogger(LogTest.class);
public void method(){
logger.info("开始访问:{}","www.baidu.com");
//some
System.out.println("---------------");
logger.debug("");
logger.error("");
logger.info("访问结束!");
}
}
在执行这个类里的方法时,就会在运行窗口打出日志。