Java开发常见知识[方便开发或者一些常见的坑]

  1. BeanUtils.copyProperties(packedDTOS.get(0), docContent)
    Bean拷贝实体类的属性可以避免很多赋值,但是注意在dest元素有值的时候,不要覆盖。
  2. likeBOs != null && !likeBOs.isEmpty() 。List判空缩写
    等价于 !CollectionUtils.isEmpty(likeBOs)。Strings.isBlank()类似。
  3. 常识: 空指针异常在很多语言中,都是运行时异常,注意判空。要不后面测试或者上线的时候就是灾难。
    在哪一层判空,在Controller中判空这是普遍要做的,但是Service里面传的参数要不要第二次判空,取决于别人调用你这个方法多吗。[有很多时候同事直接调用你写的方法并传不合法值,注意健壮性]
  4. 返回List的方法 不要返回空而要返回空集合。
    如果性能要求高返回Collections.emptyList(),否则new ArrayList()。
    Collections.emptyList()这个方法返回一个空集合,并不会新建对象,而是返回public static final List EMPTY_LIST = new EmptyList<>(); .
  5. 判断两个值相等。Objects.equals
Integer a= 1;
Long b= 1L;
System.out.println(150000==150000L);
System.out.println(a.equals(b));
  1. List item

map返回默认值。
getOrDefault。程序里面要尽可能避免返回空值。

  1. 前端Long类型会截断。15位以上都会截断。
  2. lombok是真的好用, 实体类里面可以定义静态类,对于只用转换一次的实体类,不需要在定义出来。
@Data
@Accessors(chain = true)  // 填充属性方便
@Builder
public class DocContentVO {
	@JsonProperty("id")
	private Integer id;
	@JsonProperty("comment_list")
	private List<Comment> commentList;
	@JsonProperty("comment_count")
	private Integer commentCount;
	@JsonProperty("action")
	private ActionDTO action;
		@Data
	public static class ActionDTO {
		@JsonProperty("path")
		private String path;
		@JsonProperty("action")
		private String action;
		@JsonProperty("parameters")
		private ParametersDTO parameters;
		@JsonProperty("options")
		private Boolean options;

		@Data
		public static class ParametersDTO {
			@JsonProperty("collection_id")
			private String collectionId;
			@JsonProperty("docid")
			private String docid;
		}
	}
}
  1. 调用其他系统的地方,跟其他系统、或者数据库交互的地方记得添加日志并捕获异常。请求的地址,入参,出参。
  2. 只有一个元素想变成一个集合。
    Collections.singletonList(docId)
  3. 将List通过stream转化为Map的时候注意过滤。Key值相同的时候,选择第一个。
Map<String, Doc> docsMap = docService.getByDocidList(unCachedDocIds).stream()
                    .collect(Collectors.toMap(Doc::getDocid, Function.identity(), (k1, k2) -> k1));
  1. stream错误示范
    filter执行了三遍。map或者filter里面不要有过于复杂的逻辑,会导致debug困难。写起来一时爽,排查起来很麻烦。复杂的逻辑可以封装一个方法在map里面调用方法。
Map<String, DocDetail> uncachedDts = details.stream()
                    .filter(dt -> !dt.getRemoved())
                    .filter(dt -> !((dt.getRemovedImages() != null) && !dt.getRemovedImages().isEmpty()))
                    .filter(dt -> !(dt.getImgScoresJson() == null || dt.getImgScoresJson().isEmpty()))
                    .map(docDetail -> dts.put(docDetail.getId(), docDetail))
                    .filter(Objects::nonNull)
                    .collect(Collectors.toMap(DocDetail::getId, a->a));
//正确de:
            Map<String, DocDetail> uncachedDts = details.stream()
                    .filter(dt -> !dt.getRemoved()||
                            (!((dt.getRemovedImages() != null) && !dt.getRemovedImages().isEmpty()))||
                            !(dt.getImgScoresJson() == null || dt.getImgScoresJson().isEmpty()))
                    .map(docDetail -> dts.put(docDetail.getId(), docDetail))
                    .filter(Objects::nonNull)
                    .collect(Collectors.toMap(DocDetail::getId, a->a));
  1. 常量Map生成。
    public static final Map<Integer, List<Integer>> AUDIT_STAGE_MAP
            = ImmutableMap.<Integer, List<Integer>>builder()
            .put(1, Arrays.asList(1, 2, 8))
            .put(2, Arrays.asList(4, 5, 9))
            .build();
  1. 求两个Collection的并、交集。
CollUtil.intersection(stagesList, statesList)
  1. 常用Lombok注解
@Slf4j
@Data
@Accessors(chain = true)
@Builder
  1. 时间格式化输出json
		@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
		@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
		@JsonProperty("create_time")
  1. 参数校验与全局异常 todo
@GetMapping("/GetDocDetail")
    public Response<DocContentVO> getDocDetail(
    		@RequestParam("doc_id")@Pattern(regexp = "^[VT]_.*$",message = "doc_id参数不合法") String docId,
		    @RequestParam("userid")@NotNull(message = "userid参数为空") Long userid) {


Assert.notEmpty(docInfoList, String.format("docid: %s 文章不存在", docId));
  1. 全局jackson序列化配置过滤空字段为默认字段 todo
  2. 调用第三方接口,怎么接合适。。后续再补充 todo
  3. 包装类型判断
    注意可能出现空指针
if (Boolean.FALSE.equals(userWrapper.getIsFriend(docInfo.getUserid(), curUserId))) {
  1. jackson序列化时,boolean基本类型默认是 isXXX,vo对象中最好用包装类型对象。但是包装类型可能为null,输出的时候想法输出默认值。
  2. jackson序列化时实体类输出为默认值,或者过滤
    解决方案:
    objectMapper
    webConfig
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java开发常见面试题是面试中经常会被问到的问题。这些问题通常涵盖Java语言的基础知识、面向对象编程、集合框架、多线程、异常处理、IO操作、数据库等方面。以下是一些可能被问到的Java开发常见面试题的例子: 1. 什么是Java虚拟机(JVM)?它的作用是什么? 2. 什么是面向对象编程(OOP)?Java中的类和对象有什么区别? 3. Java中的集合框架有哪些?分别介绍一下它们的特点和用途。 4. 什么是多线程?Java中如何创建和管理线程?如何实现线程间的通信? 5. 什么是异常处理?Java中的异常分类是什么?如何处理异常? 6. Java中的IO操作有哪些?分别介绍一下它们的特点和用途。 7. 如何连接和操作数据库?介绍一下JDBC的基本用法。 8. 什么是Java的反射机制?如何使用反射实现动态加载类和调用方法? 9. 什么是Java的注解(Annotation)?如何自定义注解? 10. 什么是Java的设计模式?列举一些常见的设计模式及其应用场景。 以上只是一些常见Java开发面试题的例子,面试时可能还会有其他问题涉及到更深入的知识。建议在面试前充分准备,熟悉Java语言的基础知识和常用的开发技术,以便能够给出清晰且准确的答案。引用<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Java面试题大全带答案 110道(持续更新)](https://blog.csdn.net/u012889902/article/details/121614968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值