常用工具类(常用工具类体验实验心得)

  本篇文章为你整理了常用工具类(常用工具类体验实验心得)的详细内容,包含有常用工具类体验实验报告 常用工具类体验实验心得 常用工具类别 常用工具类作业 常用工具类,希望能帮助你了解 常用工具类。

  左边填充字符串

  有时候我们需要生成流水号,例如4位数的流水号,从1开始其余用字符0填充,就可以使用 leftPad 方法,示例如下:

  

@Test

 

  void testLeftPad() {

   // 0001

   Assertions.assertEquals("0001", StringUtils.leftPad("1", 4, 0));

  

 

  右边填充字符串

  

@Test

 

  void testRightPad() {

   // 1000

   Assertions.assertEquals("1000", StringUtils.rightPad("1", 4, 0));

  

 

  分割字符串

  

// ["a","b","c"]

 

  Assertions.assertEquals(Arrays.toString(new String[]{"a", "b", "c"}), Arrays.toString(StringUtils.split("a,b,c", ",")));

  

 

  字符串比较

  

// true

 

  Assertions.assertTrue(StringUtils.equals(null, null));

  // false

  Assertions.assertFalse(StringUtils.equals("null", null));

  

 

  字符串已指定子字符串开头

  

@Test

 

  void testStartWith() {

   // true

   Assertions.assertTrue(StringUtils.startsWith("hello,world", "hello"));

   // false

   Assertions.assertFalse(StringUtils.startsWith("你好,世界", "世界"));

  

 

  数值工具类

  转换为 int 类型

  将字符串转换为 int 类型,toInt(String str) 在转换失败的时候会返回默认值 0,如果需要指定默认值那么可以使用 toInt(final String str, final int defaultValue):

  

@Test

 

  void testToInt() {

   // 0

   Assertions.assertEquals(0, NumberUtils.toInt("abc"));

   // 0

   Assertions.assertEquals(0, NumberUtils.toInt("01c"));

   // 0

   Assertions.assertEquals(0, NumberUtils.toInt("1a3"));

   // 1

   Assertions.assertEquals(1, NumberUtils.toInt("foo", 1));

   // 11

   Assertions.assertEquals(11, NumberUtils.toInt("11"));

   // 11

   Assertions.assertEquals(11, NumberUtils.toInt("011", 3));

  

 

  判断数组是否为空

  

@Test

 

  void testIsEmpty() {

   // true

   Assertions.assertTrue(ArrayUtils.isEmpty(new Object[]{}));

   // false

   Assertions.assertFalse(ArrayUtils.isEmpty(new String[]{"foo"}));

  

 

  增加指定天数

  除了增加指定的天数,common-lang3 还提供了:

  addHours:增加指定小时

  addMonths:增加指定月数

  

@Test

 

  void testAddDay() {

   Date now = new Date();

   Date tomorrow = DateUtils.addDays(now, 1);

   Assertions.assertEquals(1, Duration.ofMillis(tomorrow.getTime() - now.getTime()).toDays());

   Assertions.assertEquals(Duration.ofDays(1).toMillis(), Duration.ofMillis(tomorrow.getTime() - now.getTime()).toMillis());

  

 

  格式化日期

  

tring pattern = "yyyy-MM-dd HH:mm:ss";

 

  Date d1 = DateUtils.parseDate("2022-10-22 00:00:00", pattern);

  Assertions.assertEquals("2022-10-22 00:00:00", DateFormatUtils.format(d1, pattern));

  

 

  判断是否为同一天

  

String parsePattern = "yyyy-MM-dd HH:mm:ss";

 

  Date d1 = DateUtils.parseDate("2022-10-22 00:00:00", parsePattern);

  Date d2 = DateUtils.parseDate("2022-10-22 23:59:59", parsePattern);

  // true

  Assertions.assertTrue(DateUtils.isSameDay(d1, d2));

  d1 = DateUtils.parseDate("2022-10-23 00:00:00", parsePattern);

  d2 = DateUtils.parseDate("2022-10-22 00:00:00", parsePattern);

  // false

  Assertions.assertFalse(DateUtils.isSameDay(d1, d2));

  

 

  

@Test

 

  void testGetEnum() {

   Assertions.assertThrowsExactly(IllegalArgumentException.class, () - Season.valueOf("Spring"));

   // 默认返回null,不抛出异常

   Assertions.assertNull(EnumUtils.getEnum(Season.class, "spring"));

   // 指定默认值

   Assertions.assertEquals(Season.SPRING, EnumUtils.getEnumIgnoreCase(Season.class, "spring"));

   // 忽略大小写匹配

   Assertions.assertEquals(Season.SPRING, EnumUtils.getEnum(Season.class, "spring", Season.SPRING));

  enum Season {

   SPRING,

  

 

  Guava

  分割字符串

  在了解 Guava 提供的字符串分割器之前,我们先来看看 Java 提供的字符串分隔有什么缺点,如下所示,输出的结果为:

  

",a,,b,".split(",")

 

  

 

  "", "a", "", "b", ""

  null, "a", null, "b", null

  "a", null, "b"

  "a", "b"

  以上都不对

  正确输出结果是 [, a, , b],答案是选项5:“以上都不对”。Splitter 不仅实现了字符串分隔,还提供了对应的修饰符,即对拆分结果进行处理,例如:

  

String str = "foo, bar ,,,baz";

 

  // ["foo","bar","baz"]

  Splitter.on(",")

   .trimResults()

   .omitEmptyStrings()

   .splitToList(str);

  // [上下上下左, 左, 右右]

  str = "baba上下上下左a左b右右";

  res = Splitter.on(CharMatcher.inRange(a, b))

   .trimResults()

   .omitEmptyStrings()

   .splitToList(str);

  // [上下上下左, 左, 右右]

  log.info("{}", res);

  

 

  拆分器工厂

  
当对象被不可信的库调用时,不可变形式是安全的;

  不可变对象被多个线程调用时,不存在竞态条件问题

  不可变集合不需要考虑变化,因此可以节省时间和空间。所有不可变的集合都比它们的可变形式有更好的内存利用率(分析和测试细节);

  不可变对象因为有固定不变,可以作为常量来安全使用。

  使用不可变集合

  不可变集合可以用如下多种方式创建:

  copyOf:ImmutableList.copyOf

  of:ImmutableList.of("a","b","c")

  Builder 工具,例如:

  

public static final ImmutableSet Color GOOGLE_COLORS =

 

   ImmutableSet. Color builder()

   .addAll(WEBSAFE_COLORS)

   .add(new Color(0, 191, 255))

   .build();

  

 

  连接字符串

  

@Test

 

  void testJoin() {

   // foo,bar

   Assertions.assertEquals("foo,bar", Joiner.on(,).join(ImmutableList.of("foo", "bar")));

   // foo

   Assertions.assertEquals("foo", Joiner.on(,).skipNulls().join("foo", null));

   // foo,empty

   Assertions.assertEquals("foo,empty", Joiner.on(,).useForNull("empty").join("foo", null));

  
// 抛出空指针异常

   Assertions.assertThrowsExactly(NullPointerException.class, () - Joiner.on(,).join("foo", null));

  

 

  警告:joiner实例总是不可变的。用来定义joiner目标语义的配置方法总会返回一个新的joiner实例。这使得joiner实例都是线程安全的,你可以将其定义为static final常量。

  Strings

  将 null 转换为空字符串:

  

Assertions.assertEquals("", Strings.nullToEmpty(null));

 

  

 

  将空字符串转换为 null :

  

Assertions.assertEquals(null, Strings.emptyToNull(""));

 

  Assertions.assertEquals(null, Strings.emptyToNull(null));

  

 

  CharMatcher

  

String noControl = CharMatcher.JAVA_ISO_CONTROL.removeFrom(string); //移除control字符

 

  String theDigits = CharMatcher.DIGIT.retainFrom(string); //只保留数字字符

  String spaced = CharMatcher.WHITESPACE.trimAndCollapseFrom(string, );

  //去除两端的空格,并把中间的连续空格替换成单个空格

  String noDigits = CharMatcher.JAVA_DIGIT.replaceFrom(string, "*"); //用*号替换所有数字

  String lowerAndDigit = CharMatcher.JAVA_DIGIT.or(CharMatcher.JAVA_LOWER_CASE).retainFrom(string);

  // 只保留数字和小写字母

  

 

  Spring

  判断集合是否为空

  

@Test

 

  void testIsEmpty() {

   Assertions.assertTrue(CollectionUtils.isEmpty((List ? ) null));

   Assertions.assertTrue(CollectionUtils.isEmpty((Set ? ) null));

   Assertions.assertTrue(CollectionUtils.isEmpty((Map ?, ? ) null));

   Assertions.assertTrue(CollectionUtils.isEmpty(Collections.emptyList()));

   Assertions.assertTrue(CollectionUtils.isEmpty(Collections.emptySet()));

   Assertions.assertTrue(CollectionUtils.isEmpty(Collections.emptyMap()));

   Assertions.assertTrue(CollectionUtils.isEmpty(List.of()));

   Assertions.assertTrue(CollectionUtils.isEmpty(Set.of()));

   Assertions.assertTrue(CollectionUtils.isEmpty(Map.of()));

   List Object list = new LinkedList ();

   list.add(new Object());

   Assertions.assertFalse(CollectionUtils.isEmpty(list));

   Assertions.assertFalse(CollectionUtils.isEmpty(List.of("foo")));

   Map String, String map = new HashMap ();

   map.put("foo", "bar");

   Assertions.assertFalse(CollectionUtils.isEmpty(map));

   Assertions.assertFalse(CollectionUtils.isEmpty(Map.of("foo", "bar")));

  

 

  获取集合的第一个元素

  

@Test

 

  void testFirstElement() {

   Assertions.assertNull(CollectionUtils.firstElement((Set ? ) null));

   Assertions.assertNull(CollectionUtils.firstElement((List ? ) null));

   List String list = new ArrayList ();

   list.add(null);

   // null

   Assertions.assertNull(CollectionUtils.firstElement(list));

   list = new ArrayList ();

   list.add("foo");

   // foo

   Assertions.assertEquals("foo", CollectionUtils.firstElement(list));

   list = List.of("foo", "bar");

   // foo

   Assertions.assertEquals("foo", CollectionUtils.firstElement(list));

  
void testLastElement() {

   Assertions.assertNull(CollectionUtils.lastElement((Set ? ) null));

   Assertions.assertNull(CollectionUtils.lastElement((List ? ) null));

   List String list = new ArrayList ();

   list.add(null);

   Assertions.assertNull(CollectionUtils.lastElement(list));

   list = new ArrayList ();

   list.add("foo");

   list.add("bar");

   // bar

   Assertions.assertEquals("bar", CollectionUtils.lastElement(list));

   list = List.of("foo", "bar");

   Assertions.assertEquals("bar", CollectionUtils.lastElement(list));

   Set String set = new TreeSet ();

   set.add("b");

   set.add("a");

   // b

   Assertions.assertEquals("b", CollectionUtils.lastElement(set));

   set = new TreeSet (Comparator.reverseOrder());

   set.add("b");

   set.add("a");

   // a

   Assertions.assertEquals("a", CollectionUtils.lastElement(set));

  

 

  对象属性拷贝

  添加一个测试对象:

  

class User {

 

   private String name;

   private String email;

   // 忽略getXxx和setXxx方法

  

 

  

@Test

 

  void testCopyProperties() {

   User user = new User();

   user.setName("foo");

   user.setEmail("bar");

   User target = new User();

   // 拷贝属性

   BeanUtils.copyProperties(user, target, "email");

   Assertions.assertEquals("foo", target.getName());

   Assertions.assertNull(target.getEmail());

  

 

  命名的 ThreadLocal

  

@Test

 

  void testNamedThreadLocal() {

   NamedThreadLocal String threadLocal = new NamedThreadLocal ("task");

   Assertions.assertEquals("task", threadLocal.toString());

  

 

  判断对象是否相等

  

@Test

 

  void testNullSafeEquals() {

   Assertions.assertTrue(ObjectUtils.nullSafeEquals(null, null));

   Assertions.assertTrue(ObjectUtils.nullSafeEquals("a", "a"));

   Assertions.assertTrue(ObjectUtils.nullSafeEquals(Optional.of("a"), Optional.of("a")));

  

 

  判断对象是否为空

  

@Test

 

  void testIsEmpty() {

   Assertions.assertTrue(ObjectUtils.isEmpty((Object) null));

   Assertions.assertTrue(ObjectUtils.isEmpty(Optional.empty()));

   Assertions.assertTrue(ObjectUtils.isEmpty(""));

   Assertions.assertTrue(ObjectUtils.isEmpty(new String[]{}));

   Assertions.assertTrue(ObjectUtils.isEmpty(Collections.emptyList()));

   Assertions.assertTrue(ObjectUtils.isEmpty(Collections.emptyMap()));

  

 

  资源工具类

  有时候我们需要加载 classpath 目录下的资源,例如:

  

File file = new File(ResourceUtilsTests.class.getClassLoader().getResource("log4j2.xml").toURI());

 

  Assertions.assertEquals("log4j2.xml", file.getName());

  

 

  使用 Spring 的 ResourceUtils 只需要这么写:

  

File file = ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX + "log4j2.xml");

 

  Assertions.assertEquals("log4j2.xml", file.getName());

  

 

  

@Test

 

  void testStopWatch() throws InterruptedException {

   // 创建一个计时器(秒表)

   StopWatch stopWatch = new StopWatch();

   // 开始计时

   stopWatch.start();

   Thread.sleep(Duration.ofSeconds(1).toMillis());

   // 停止计时

   stopWatch.stop();

   // 获取总耗时(毫秒)

   // 1005ms.

   log.info("{}ms.", stopWatch.getTotalTimeMillis());

   // 1s.

   log.info("{}s.", Duration.ofMillis(stopWatch.getTotalTimeMillis()).toSeconds());

  

 

  UriComponentsBuilder

  有时候我们需要在服务端手动发送请求,在请求 url 我们使用字符串拼接的方式,Spring 提供了UriComponentsBuilder 能让我们更加语意化来构建一个请求url,而且还会自动对url进行编码:

  

@Test

 

  void testFromUriString() {

   String uri = UriComponentsBuilder

   .fromUriString("/coffee/{foo}/{id}/like")

   .build("aa", "bb")

   .toString();

   Assertions.assertEquals("/coffee/aa/bb/like", uri);

   uri = UriComponentsBuilder

   .fromUriString("http://localhost:8080/coffe/{id}")

   .encode()

   .build(1).toString();

   Assertions.assertEquals("http://localhost:8080/coffe/1", uri);

   uri = UriComponentsBuilder

   .fromUriString("http://localhost:8080/coffee?name={name}")

   .build(" ").toString();

   Assertions.assertEquals("http://localhost:8080/coffee?name=%20",uri);

  

 

  hutool

  

@Test

 

  void testIsCitizenId() {

   // 校验是否为身份证

   Assertions.assertTrue(Validator.isCitizenId("110101199003074477"));

   // 15位身份证号码验证

   Assertions.assertTrue(Validator.isCitizenId("410001910101123"));

   // 10位身份证号码验证

   Assertions.assertTrue(Validator.isCitizenId("U193683453"));

  @Test

  void testIsMobile() {

   // 校验是否为手机号

   Assertions.assertTrue(Validator.isMobile("13900221432"));

   Assertions.assertTrue(Validator.isMobile("015100221432"));

   Assertions.assertTrue(Validator.isMobile("+8618600221432"));

  @Test

  void testIsPlateNumber() {

   // 校验是否为车牌号

   Assertions.assertTrue(Validator.isPlateNumber("粤BA03205"));

   Assertions.assertTrue(Validator.isPlateNumber("闽20401领"));

  

 

  emoji

  

@Test

 

  void testToUnicode() {

   String unicode = EmojiUtil.toUnicode(":smile:");

   Assertions.assertEquals("

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: