这9个工具库让我的Java开发效率提升了80%
这9个工具库让我的Java开发效率提升了80%
在 Java 语言的庞大体系中,有很多不错的工具类,能够大大提升我们的开发效率。但如果你不了解它们,就很可能会重复编写一些类似的代码。这不仅浪费时间,而且你写的可能还不如现有的好。今天,我决定和大家分享一些我经常使用的工具类,希望对你们有所帮助。
首先是 java.util 包下的 Collecti 类。这个类主要用于操作集合,我个人非常喜欢使用它。以下是一些常用功能:
1.1 排序
在工作中,经常需要对集合进行排序。让我们看看如何使用 Collecti 工具实现升序和降序排列:
代码语言:java复制List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add();
Collecti.sort(list); //升序
println(list);
Collecti.reverse(list); //降序
println(list);
输出:
代码语言:java复制[1, 2, ]
[, 2, 1]
1.2 获取最大值或最小值
有时需要在集合中到最大值或最小值,这时可以使用 Collecti 的 max 和 min 方法。
例如:
代码语言:java复制List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add();
Integer max = (list);
Integer min = (list);
println(max);
println(min);
输出:
代码语言:java复制
1
1. 返回空集合
有时,在检查为空后,我们需要返回一个空集合,可以使用 emptyList 方法。例如:
代码语言:java复制private List<Integer> fun(List<Integer> list) {
if (list == null || list.size() == 0) {
return ();
}
return list;
}
1.4 转换为不可修改的集合
为了防止后续程序修改某个集合的结果,有时我们需要将某个集合定义为不可修改的。这可以通过使用 Collecti 的 unmodifiablexxx 方法轻松实现:
代码语言:java复制List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add();
List<Integer> integers = Collecti.unmodifiableList(list);
integers.add(4);
println(integers);
输出:
代码语言:java复制Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.Collecti$UnmodifiableCollection.add(Collecti.java:1092)
at com.spring.demo.(DemoApplication.java:46)
1.5 转换为线程安全的集合
我们都知道,Java 中的许多集合,如 ArrayList、LinkedList、HashMap、HashSet 等,都不是线程安全的。
换句话说,在多线程环境中,向这些集合中添加数据存在线程安全问题。这时,可以使用 Collecti 的 synchronizedxxx 方法直接将这些线程不安全的集合转换为线程安全的集合。例如:
代码语言:java复制List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add();
List<Integer> integers = Collecti.synchronizedList(list); //将 ArrayList 转换为线程安全的集合
println(integers);
它的底层实现会创建 SynchronizedRandomAccessList 或 SynchronizedList 类。这两个类的许多方法都会用 synchronized 加锁。
Collecti 工具类中还有许多常用方法,这里就不一一介绍了。
对于集合操作,除了前面提到的 Collecti 工具类,CollectionUtils 工具类也非常常用。目前,比较主流的是 apache 的 org. 包下的 CollectionUtils 工具类。
代码语言:java复制<dependency>
<groupId>comm-collecti</groupId>
<artifactId>comm-collecti</artifactId>
<version>.2.2</version>
</dependency>
它提供了许多方法,例如:
当然,Spring 框架的 org.springframework.util 包下也有 CollectionUtils 工具类。不过,我个人推荐使用 apache 包下的 CollectionUtils 工具类,因为它的工具更多且更全面。举个简单的例子,Spring 中的 CollectionUtils 工具类没有判断集合是否不为空的方法,而 apache 中的有。
接下来,我们以 apache 中的 CollectionUtils 工具类为例,介绍一些常用方法。
2.1 检查集合是否为空
CollectionUtils 工具类的 isEmpty 方法可以轻松判断集合是否为空,isotEmpty 方法判断集合是否不为空。
代码语言:java复制List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add();
if (CollectionUtils.isEmpty(list)) {
println("Collection is empty.");
}
if (CollectionUtils.isotEmpty(list)) {
println("Collection is not empty");
}
2.2 对两个集合进行操作
有时我们需要对两个已有的集合进行操作,比如取交集或并集。
代码语言:java复制List<Integer> list = new ArrayList<>();
list.add(2);
list.add(1);
list.add();
List<Integer> list2 = new ArrayList<>();
list2.add(2);
list2.add(4);
//获取并集
Collection<Integer> unionList = CollectionUtils.union(list, list2);
println(unionList);
//获取交集
Collection<Integer> intersectionList = CollectionUtils.intersection(list, list2);
println(intersectionList);
//获取交集的补集
Collection<Integer> disjunctionList = CollectionUtils.disjunction(list, list2);
println(disjunctionList);
//获取差集
Collection<Integer> subtractList = CollectionUtils.subtract(list, list2);
println(subtractList);
执行结果:
代码语言:java复制[1, 2, , 4]
[2]
[1, , 4]
[1, ]
如果你引入 com.google.guava 的依赖,会得到很多有用的工具类。这里推荐一个 com. 包下的集合工具:Lists。
代码语言:java复制<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>28.2-jre</version>
</dependency>
.1 快速初始化集合
有时,我们想初始化集合中的一些元素,这时可以使用 Lists 的 newArrayList 方法。例如:
代码语言:java复制List<Integer> list = (1, 2, );
这比直接创建一个列表然后逐个添加元素更方便。
执行结果:
代码语言:java复制[1, 2, ]
.2 笛卡尔积
如果你想对两个集合进行笛卡尔积操作,Lists 的 cartesianProduct 方法可以帮你实现:
代码语言:java复制List<Integer> list1 = (1, 2, );
List<Integer> list2 = (4, 5);
List<List<Integer>> productList = (list1, list2);
println(productList);
执行结果:
代码语言:java复制[[1, 4], [1, 5], [2, 4], [2, 5], [, 4], [, 5]]
. 分割集合
如果你想将一个大集合分割成几个小集合,可以使用 Lists 的 partition 方法:
代码语言:java复制List<Integer> list = (1, 2, , 4, 5);
List<List<Integer>> partitionList = Lists.partition(list, 2);
println(partitionList);
执行结果:
代码语言:java复制[[1, 2], [, 4], [5]]
在这个例子中,列表有 5 条数据。我将列表集合分成了 份,每份大小为 2,即变成了 个小集合。
这是我最喜欢的方法之一,我在项目中经常使用。
.4 流处理
如果我们想对集合内的元素进行操作,可以使用 Lists 的 transform 方法。例如:
代码语言:java复制List<String> list = ("a", "b", "c");
List<String> transformList = (list, x -> ());
println(transformList);
小写字母被转换为大写字母。
执行结果:
代码语言:java复制[A, B, C]
.5 反转顺序
Lists 有一个 reverse() 方法用于反转顺序。例如:
代码语言:java复制List<Integer> list = (, 1, 2, 5, 4);
List<Integer> reverseList = Lists.reverse(list);
println(reverseList);
执行结果:
代码语言:java复制[4, 5, 2, 1, ]
Lists 还有其他有用的工具,这里只是举几个例子,感兴趣的朋友可以自行研究。
在 jdk7 之后,提供了 Objects 工具类,我们可以通过它对对象进行操作。
4.1 检查对象是否为空
在 Java 中,一切皆对象。检查对象是否为空可以说是无处不在。Objects 的 isull 方法检查对象是否为空,nonull 方法检查对象是否不为空。例如:
代码语言:java复制Integer i = new Integer(10);
if (Objects.isull(i)) {
println("Object is null");
}
if ((i)) {
println("Object is not null");
}
4.2 对象为空时抛出异常
如果我们想在对象为空时抛出空指针异常,可以使用 Objects 的 requireonull 方法。例如:
代码语言:java复制Integer i = new Integer(128);
Objects.requireonull(i);
Objects.requireonull(i, "Parameters cannot be null");
Objects.requireonull(i, () -> "Parameters cannot be null");
4. 检查两个对象是否相等
我们经常需要检查两个对象是否相等。Objects 为我们提供了 equals 方法,可以很方便地实现:
代码语言:java复制Integer i1 = new Integer(1);
Integer i2 = new Integer(1);
println((i1, i2));
执行结果:
代码语言:java复制true
但是使用这个方法时有一个坑。例如,如果将例子改为:
代码语言:java复制Integer i = new Integer(1);
Long l = new Long(1);
println((i, l));
执行结果:
代码语言:java复制false
你知道为什么输出为 false 吗?可以在评论区交流。
4.4 获取对象的哈希码
如果你想获取某个对象的哈希码,可以使用 Objects 的 hashCode 方法。例如:
代码语言:java复制String str = new String("abc");
println(Objects.hashCode(str));
执行结果:
代码语言:java复制9654
关于 Objects 的内容就介绍到这里,更多的方法可以自行研究。
字符串在我们的日常工作中使用得非常频繁。在我们的代码中,经常需要检查字符串是否为空、转换大小写、分割字符串、比较字符串、去除多余空格、连接字符串、使用正则表达式等等。
如果我们只使用 String 类提供的方法,就需要手动编写大量额外的代码,既耗时又费力。作为程序员,当然要学会偷懒。现在有一个现成的工具类,即 org.apachem.lang 包下的 StringUtils 工具类,它为我们提供了非常多操作 String 的方法。
5.1 检查字符串是否为空
实际上,对于空字符串,不仅有 null,还有“”、“ ”、“null”等多种情况。StringUtils 为我们提供了多个静态方法来检查字符串是否为空。例如:
代码语言:java复制String str1 = null;
String str2 = "";
String str = " ";
String str4 = "abc";
println(StringUtils.isEmpty(str1));
println(StringUtils.isEmpty(str2));
println(StringUtils.isEmpty(str));
println(StringUtils.isEmpty(str4));
println("-------------------------------------");
println(StringUtils.isotEmpty(str1));
println(StringUtils.isotEmpty(str2));
println(StringUtils.isotEmpty(str));
println(StringUtils.isotEmpty(str4));
println("-------------------------------------");
println(StringUtils.isBlank(str1));
println(StringUtils.isBlank(str2));
println(StringUtils.isBlank(str));
println(StringUtils.isBlank(str4));
println("-------------------------------------");
println(StringUtils.isotBlank(str1));
println(StringUtils.isotBlank(str2));
println(StringUtils.isotBlank(str));
println(StringUtils.isotBlank(str4));
输出:
代码语言:java复制true
true
false
false
false
false
true
true
true
true
true
false
false
false
false
true
示例中的四个空检查方法:isEmpty、isotEmpty、isBlank 和 isotBlank。你可以根据实际情况使用这些方法。
建议优先使用 isBlank 和 isotBlank 方法,因为它们会考虑更多情况。
5.2 分割字符串
分割字符串是一个常见需求。如果直接使用 String 类的 split 方法,可能会出现空指针异常。
代码语言:java复制String str1 = null;
println(StringUtils.split(str1, ","));
println(str1.split(","));
输出:
代码语言:java复制Exception in thread "main" java.lang.ullPointerException
at java.base/java.util.Objects.requireonull(Objects.java:221)
at java.base/java.util.regex.Pattern.split(Pattern.java:1269)
at java.base/java.lang.String.split(String.java:292)
at com.spring.demo.(DemoApplication.java:9)
使用 StringUtils 的 split 方法会返回 null,而使用 String 的 split 方法会报指针异常。
5. 检查是否为纯数字
给定一个字符串,要检查它是否为纯数字,可以使用 isumeric 方法。例如:
代码语言:java复制String str1 = "12";
String str2 = "12abc";
String str = "0.";
println(StringUtils.isumeric(str1));
println(StringUtils.isumeric(str2));
println(StringUtils.isumeric(str));
输出:
代码语言:java复制true
false
false
5.4 将集合连接成字符串
有时,我们需要将集合的内容连接成一个字符串然后输出,这时可以使用 join 方法。例如:
代码语言:java复制List<String> list = ("a", "b", "c");
List<Integer> list2 = (1, 2, );
println(StringUtils.join(list, ","));
println(StringUtils.join(list2, " "));
输出:
代码语言:java复制a,b,c
1 2
还有很多实用的方法,这里就不一一介绍了。
Spring 为我们提供了一个用于 JavaBean 的工具类,它在 org.springframework.beans 包下,名字是:BeanUtils。
6.1 复制对象属性
你是否遇到过这样的需求:将某个对象的所有属性复制到另一个对象。这时可以使用 BeanUtils 的 copyProperties 方法。例如:
代码语言:java复制User user1 = new User();
user1.setId(1L);
user1.setame("Dylan");
user1.setAddress("Hong Kong");
User user2 = new User();
(user1, user2);
println(user2);
6.2 获取指定类的指定方法
如果你想获取某个类的指定方法以便后续操作,可以使用 BeanUtils 的 findDeclaredMethod 方法。例如:
代码语言:java复制Method declaredMethod = BeanUtils.findDeclaredMethod(, "getId");
println(declaredMethod.getame());
6. 获取指定方法的参数
如果你想获取某个方法的参数,可以使用 BeanUtils 的 findPropertyForMethod 方法。例如:
代码语言:java复制Method declaredMethod = BeanUtils.findDeclaredMethod(, "getId");
PropertyDescriptor propertyForMethod = BeanUtils.findPropertyForMethod(declaredMethod);
println(propertyForMethod.getame());
还有很多实用的方法,这里就不一一介绍了。
有时,我们在项目中需要使用反射功能。如果使用最原始的方法开发,代码量会非常大且麻烦,需要处理大量异常和访问权限问题。
好消息是,Spring 为我们提供了一个 ReflectionUtils 工具类,它在 org.springframework.util 包下。
7.1 获取方法
如果你想获取某个类的某个方法,可以使用 ReflectionUtils 类的 findMethod 方法。例如:
代码语言:java复制Method method = ReflectionUtils.findMethod(, "getId");
7.2 获取字段
如果你想获取某个类的某个字段,可以使用 ReflectionUtils 类的 findField 方法。例如:
代码语言:java复制Field field = ReflectionUtils.findField(, "id");
7. 执行方法
如果你想通过反射调用某个方法并传递参数,可以使用 ReflectionUtils 类的 invokeMethod 方法。例如:
代码语言:java复制ReflectionUtils.invokeMethod(method, springContextsUtil.getBean(beaname), param);
7.4 检查字段是否为常量
如果你想检查某个字段是否为常量,可以使用 ReflectionUtils 类的 isPublicStaticFinal 方法。例如:
代码语言:java复制Field field = ReflectionUtils.findField(, "id");
println(ReflectionUtils.isPublicStaticFinal(field));
7.5 检查是否为 equals 方法
如果你想检查某个方法是否为 equals 方法,可以使用 ReflectionUtils 类的 isEqualsMethod 方法。例如:
代码语言:java复制Method method = ReflectionUtils.findMethod(, "getId");
println(ReflectionUtils.isEqualsMethod(method));
还有很多实用的方法,这里就不一一介绍了。
有时,我们需要对数据进行加密,比如使用 md5 或 sha256。我们可以使用 Apache 的 org.digest 包下的 DigestUtils 类。
8.1 MD5 加密
如果你想使用 MD5 加密数据,可以使用 DigestUtils 的 md5Hex 方法。例如:
代码语言:java复制String md5Hex = ("Dylan");
println(md5Hex);
8.2 SHA256 加密
如果你想使用 SHA256 加密数据,可以使用 DigestUtils 的 sha256Hex 方法。例如:
代码语言:java复制String md5Hex = DigestUtils.sha256Hex("Dylan");
println(md5Hex);
这个工具类还有许多其他加密方法:
很多时候,我们会在代码中定义 HTTP 返回码。例如,正常接口返回 200,异常返回 500,如果接口不到则返回 404。
代码语言:java复制private int SUCCESS_CODE = 200;
private int ERROR_CODE = 500;
private int OT_FOUD_CODE = 404;
实际上,org.springframework.http 包下的 HttpStatus 枚举或 org.apache.http 包下的 HttpStatus 接口已经为我们定义了常用的 HTTP 返回码,我们可以直接使用,真的不需要重新定义。以下是 HttpStatus 类的部分内容:
在这篇文章中,我介绍了 Java 开发中 9 个非常实用的工具类,它们可以帮助我们提高开发效率,减少重复代码,并简化日常的开发任务。从集合操作到字符串处理,从对象操作到反射机制,再到数据加密和 HTTP 状态码处理,这些工具类提供了强大而灵活的功能,让我们能够更加专注于业务逻辑的实现,而不是底层细节的处理。
希望这些工具能够为你的项目带来便利,提升你的开发效率。如果你有任何疑问或想要进一步探讨这些工具的使用,欢迎在评论区交流。
#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 12 条评论) |
本站网友 软磷脂 | 25分钟前 发表 |
1 | |
本站网友 银河湾花园 | 11分钟前 发表 |
"getId"); println(declaredMethod.getame());6. 获取指定方法的参数如果你想获取某个方法的参数 | |
本站网友 待产准备 | 29分钟前 发表 |
有很多不错的工具类 | |
本站网友 戒烟最好的办法 | 14分钟前 发表 |
在我们的代码中 | |
本站网友 脂肪的食物来源 | 12分钟前 发表 |
这里只是举几个例子 | |
本站网友 qq许愿墙 | 19分钟前 发表 |
可以使用 Lists 的 partition 方法:代码语言:java复制List<Integer> list = (1 | |
本站网友 godd | 13分钟前 发表 |
[ | |
本站网友 男友一个月深蹲后 | 16分钟前 发表 |
4] | |
本站网友 如何欲擒故纵 | 10分钟前 发表 |
比较字符串 | |
本站网友 涩女人 | 15分钟前 发表 |
一切皆对象 | |
本站网友 过敏性皮肤炎 | 16分钟前 发表 |
例如:代码语言:java复制List<Integer> list = new ArrayList<>(); list.add(2); list.add(1); list.add(); Integer max = (list); Integer min = (list); println(max); println(min);输出:代码语言:java复制 11. 返回空集合有时 |