MENU

Java

判断字符串是否为指定日期格式

在做单表动态增删改查功能时产生了这样一个需求,判断传入的字符串是否符合指定数据库插入的格式要求;很简单的一个问题,但是没找到直接可用的判断方法。首先想到的是用SimpleDateFormat来parse字符串,如果抛出异常则为不符合,反之则符合,代码如下:

private static boolean isValidFormat(String format, String value) {
    boolean ok = true;
    DateFormat df = new SimpleDateFormat(format);
    try {
        df.parse(value);
    } catch (ParseException e) {
        ok = false;
    }
    return ok;
}

使用yyyy-MM-dd HH:mm:ss格式和2019-02-31 13:12:20进行测试,

@Test
public void test_1() {
    String format = "yyyy-MM-dd HH:mm:ss";
    String value = "2019-02-31 13:12:20";
    Assert.assertFalse(isValidFormat(format, value));
}

Read More

包含数字大小写字母特殊字符且不少于8位的正则

验证方法:

/**
 * 密码长度8到16位
 * 包含数字
 * 包含大写字母
 * 包含小写字母
 * 包含特殊字符
 */
public static boolean validatePassword(String password) {
    if (StringUtils.isBlank(password)) {
        return false;
    }
    Pattern pattern = Pattern.compile("(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[^\\w\\s]).{8,16}");
    Matcher matcher = pattern.matcher(password);
    return matcher.matches();
}

Read More

Java 8 学习笔记(二)Lambda与Stream

实践数据如下,电影列表:包括名称、评分、时长、年份和演员列表。

Movie(name=无极, score=5.0, duration=121, year=2005, 
actorList=[Actor(name= 张东健, birthday=1972-03-07), Actor(name=张柏芝, birthday=1980-05-24), Actor(name=真田广之, birthday=1960-10-12), Actor(name=谢霆锋, birthday=1980-08-29), Actor(name=刘烨, birthday=1978-03-23)])

Movie(name=救火英雄, score=7.2, duration=115, year=2014, 
actorList=[Actor(name=谢霆锋, birthday=1980-08-29), Actor(name=余文乐, birthday=1981-11-13), Actor(name=任达华, birthday=1955-03-19), Actor(name=胡军, birthday=1968-03-18)])

Movie(name=喜剧之王, score=8.6, duration=85, year=1999, 
actorList=[Actor(name=周星驰, birthday=1962-06-22), Actor(name=张柏芝, birthday=1980-05-24), Actor(name=莫文蔚, birthday=1970-06-02)])

Movie(name=大话西游之月光宝盒, score=8.9, duration=87, year=1995, 
actorList=[Actor(name=周星驰, birthday=1962-06-22), Actor(name=吴孟达, birthday=1952-01-02), Actor(name=罗家英, birthday=1947-08-27), Actor(name=蓝洁瑛, birthday=1963-04-27), Actor(name=莫文蔚, birthday=1970-06-02)])

Stream化

计算评分不小于8.0的电影数量,在jdk 1.8 之前可以使用for循环或者Iterator来实现

int count = 0;
BigDecimal score = new BigDecimal("8.0");
for (Movie movie : movieList) {
    if (movie.getScore().compareTo(score) >= 0) {
        count++;
    }
}
System.out.println(count);

在jdk 1.8 中,调用stream()方法创建一个Stream,使用filter方法过滤,并不会改变列表的内容,而是返回一个新的Stream,最后调用count()方法计算个数。

long count = movieList.stream().filter(movie -> movie.getScore().compareTo(score) >= 0).count();
System.out.println(count);

Read More

Java 8 学习笔记(一)Hello Lambda

在Android、Swing中,会经常看到类似代码;将行为包装成一个对象(匿名内部类)进行传递。为了传递一行逻辑代码,需要额外样板代码,而且可读性较差。

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "you have clicked Button", Toast.LENGTH_SHORT).show();
    }
});

在Java 8中引入了lambda表达式,Lambda可以简单理解为一个代码块,我们可以直接把Lambda作为参数传给方法;在上述代码中,我们可以直接传递行为代码,而不需要构造一个匿名内部类:

button.setOnClickListener(v -> Toast.makeText(MainActivity.this, "you have clicked Button", Toast.LENGTH_SHORT).show());

Read More

String.valueOf(null)引出的两个问题

昨天有人在群里问了这么个问题:

System.out.println(String.valueOf(null));

会报空指针异常;而下面这样就可以打印null

Object obj = null;    
System.out.println(String.valueOf(obj));

debug代码会发现,两种方式执行了不同的重载方法,第一种执行了

public static String valueOf(char data[]) {
    return new String(data);
}

第二种执行了

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

如果对重载不熟悉,很难解释其中原因;当然null是另一个让人头疼的问。

重载

Java的重载解析过程是以两阶段运行的:

  • 第一阶段:选取所有可获得并且可应用的方法或构造器。

Read More