Java精简代码小技巧(不定时更新)_木先森的博客-程序员秘密

技术标签: Java  代码  stream  

代码的精简度,决定了代码的优美程度,易读性。虽然Java很难做到Python同样的代码量,但是善用一些小技巧还是对我们精简代码有所帮助。本文旨在记录一些小技巧。

1. 工具包

都说Java生态好,很多通用工具无需我们自己造轮子,直接引入依赖调用即可,列举最常用的工具包:

Apache Commons系列

Commons系列用于简化代码的常用工具包:

功能
Codec 处理常用的编码方法的工具类包 例如DES、SHA1、MD5、Base64等.
Collections java集合框架操作.
IO io工具的封装.
Lang(Lang3) Java基本对象方法的工具类包 如:StringUtils,ArrayUtils等等.

FastJson工具包

阿里的Json工具包,极其方便的实现Json和Java对象的转换。

Spring工具

Spring作为Java开发的核心框架,里面也包含了很多好用的工具,最常用的两个:BeanUtils和CollectionUtils。

2. 巧用链式调用

Setter类型的方法将当前对象返回去,如:

public User setNick(String nick) {
    
  this.nick = nick;
  return this;
}

将所有Setter均如此改造,构造用户“ID1,昵称张三,账号zhangsan,密码123456,状态1”:

User user = new User()
	.setId(1)
	.setNick("张三")
	.setAccount("zhangsan")
	.setPwd("123456")
	.setState(1)

3. lombok

lombok可以通过注解代替繁琐的Getter,Setter,Constructor,equals,hashCode,toString等,让Java代码变得简洁。使用很简单,本文不详细介绍。

创建链式Setter方法的注解:@Accessors(chain = true),如User类使用lombok后代码如下:

@Data
@Accessors(chain = true)
@ToString
public class User {
    
    private Integer id;
    private  String nick;
    private  String account;
    private  String pwd;
    private  Integer state;
    private LocalDateTime createTime;
}

4. 巧用stream

stream功能很强大,可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。

stream常用功能:

4.1. filter[过滤]

从名字能看出来,filter就是用于筛选,例如:筛选出name不为空的用户代码如下:

userList = userList.stream().filter(u -> u.getNick() != null).collect(Collectors.toList());

4.2. map[映射] Collectors[聚合]

使用map和Collectors可以轻松的完成类型转换和统计:

// 转Set
Set<User> userSet = userList.stream().collect(Collectors.toSet());

// 获取用户账号Set集合
Set<String> accountSet = userList.stream().map(User::getAccount).collect(Collectors.toSet());

// 转为以account为键的Map
Map<String,User> userMap = userList.stream().collect(Collectors.toMap(User::getAccount,u->u));

// 以state分组
Map<Integer,List<User>> userGroupMap = userList.stream().collect(Collectors.groupingBy(User::getState));

// 以state分组的account
Map<Integer,List<String>> userAccountGroupMap = userList.stream().collect(
Collectors.groupingBy(User::getState,Collectors.mapping(User::getAccount,Collectors.toList())));

// 统计状态为1的数量
userList.stream().filter(u -> Integer.valueOf(1).equals(u.getState())).count();

// 统计各状态数量
Map<Integer,Long> userCountMap = userList.stream().collect(Collectors.groupingBy(User::getState,Collectors.counting()));

使用链式调用,如需求:排除account为“admin”的,统计各状态数量的写法:

Map<Integer, Long> userCountMap = userList.stream()
    .filter(u -> !"admin".equals(u.getAccount()))
    .collect(Collectors.groupingBy(User::getState, Collectors.counting()));

5. 巧用EnumMap

EnumMap以枚举作为Key,有序且初始化长度合理,可以省略非必要的类定义且具有明确的Key。如下所示:

enum Region{
    
  BJ,HB,HLJ
}
public Map<Region,Integer> compare(){
    
  Map<Region,Integer> result = new EnumMap(Region.class);
  result.put(Region.BJ,30);
  result.put(Region.HB,20);
  result.put(Region.HLJ,10);
  return result;
}

6.使用interface存储常量

interface中的属性默认为public static final,多级定义更显简洁;

/** 常量 */
public interface Const{
        
    /** 状态 */    
    interface Status{
            
        String SU = "SU";        
        String FA = "FA";    
    }
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/u013650708/article/details/90066638

智能推荐

java jpa jar_如何找到Spring Data JPA和Spring版本的正确jar文件_仙道SEVEN的博客-程序员秘密

小编典典由于您拥有POM,这意味着您正在使用Maven,并且Maven拥有一个名为dependency的插件,您可以在其上调用dependency:list该插件,该插件将列出所有jar依赖项及其版本。只需在项目的根目录中调用(假设您使用的是启动器):./mvnw dependency:list您将列出您的jar:[INFO] -----------------------------------...

comparator实现排序_忆成风的博客-程序员秘密

package com.company;import java.util.ArrayList;import java.util.Collections;import java.util.Comparator;import java.util.List;/** * @author yilin * comparator排序 */public class SortTest { ...

《数据仓库》读书笔记:第3章 设计数据仓库_search-lemon的博客-程序员秘密

《数据仓库》读书笔记:第3章 设计数据仓库1. 数据仓库的建造1.1 数据从操作型环境到数据仓库1. 数据仓库的建造数据仓库是在启发方式下建造的,一个阶段的开发完全依赖于上一阶段的结果,需求只有在装载部分数据并开始使用才能弄清楚。建造数据仓库主要包含两个部分的工作:① 与操作型系统接口的设计;② 数据仓库本身的设计。1.1 数据从操作型环境到数据仓库数据从操作型环境到数据仓库...

CDH中文文档下载,Cloudera中文手册,CM中文文档_jast_zsh的博客-程序员秘密_cdh中文文档

CDH中文文档下载链接:https://pan.baidu.com/s/1G-8WCafpPZ3p7ZDeXLcgug提取码:ubxz

Windows下使用MinGW+msys编译ffmpeg-2.6.3,没生成ffplay.exe_SunrayME的博客-程序员秘密

MINGW32:/c/ffmpeg/ffmpeg-2.6.3configure后,显示出SDL support no,C:\ffmpeg\ffmpeg-2.6.3中生成的config.mak用UltraEdit打开,看到!CONFIG_FFPLAY=yes,!HAVE_SDL=yes,感叹号代表注释掉了,要手动修改config.mak,把感叹号去掉。

提示超时 java.sql.SQLException: An attempt by a client to checkout a Connection has timed [email protected]小小白!的博客-程序员秘密

问题描述: 最近在调试程序的时候出现java.sql.SQLException: An attempt by a client to checkout a Connection has timed ......异常,出现该异常的情况是因为我要上传稍微比较大的数据。当数据量较小的时候该异常则不存在。起初以为是数据较大影响的,后来发现是因为我的程序中有一次需要切换数据源进行短暂的查询,...

随便推点

使用mailx发送邮件_IT_狂奔者的博客-程序员秘密_mailx发送邮件

由于阿里云已将25端口封了(改用465端口),所以在ECS上往外发邮件时要作相应的配置才行。 本文使用的是企业邮箱1.安装相应软件包yum -y install mailx2.下载证书#创建目录,用来存放证书mkdir -p /root/.certs/#向腾讯企业邮箱请求证书echo -n|openssl s_client -connect smtp.exmail.qq.com:465|sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/.

我们一起学 ABAP (01) ~ 初识SAP ABAP_WDBS_05的博客-程序员秘密

转载地址:http://blog.csdn.net/qq_37625033/article/details/656282141、SAP和ABAP是什么?   SAP的英文全名是:System Applications and Products 的简写,它即是一个公司的名字,也是其公司开发的软件的名字。ABAP是SAP的开发语言,SAP几乎都是用ABAP写的。现在主流SAP R/

STM32定时器之中断延时_公子 魏的博客-程序员秘密_stm32定时器中断延时

STM32定时器之中断延时STM32的定时器有通用定时器、基本定时器

/usr/local/zookeeper-3.4.6/bin/zkServer.sh start_秉寒-CHO的博客-程序员秘密

cat /etc/profile 配置 /usr/local/zookeeper-3.4.6/bin/zkServer.sh start

JavaScript_h294590501的博客-程序员秘密

JavaScriptJavaScript 是一种属于网页的脚本语言,已经被广泛用于 Web 应用开发,常用来为网页添加各式各样的动态功能,为用户提供更流畅美观的浏览效果。通常 JavaScript 脚本是通过嵌入在 HTML 中来实现自身的功能的。JavaScript 的作用HTML 制作网页,搭建网页的结构和内容。CSS 对网页进行美化,装饰网页。JavaScript 让网页有交互功能,...

04常用 Linux 命令的基本使用_G5Lorenzo的博客-程序员秘密

一、学习 Linux 终端命令的原因Linux 刚面世时并没有图形界面,所有的操作全靠命令完成,如 磁盘操作、文件存取、目录操作、进程管理、文件权限 设定等在职场中,大量的 服务器维护工作 都是在 远程 通过 SSH 客户端 来完成的,并没有图形界面,所有的维护工作都需要通过命令来完成在职场中,作为后端程序员,必须要或多或少的掌握一些 Linux 常用的终端命令Linux 发行版本的命令...