使用Lambda表达式对中文拼音排序(中文字典排序)
今天项目上有一个需求,要求对用户名按照拼音排序(不通过数据库端SQL操作),由于用户名为中文,所以使用常规排序并不能解决问题。
package lambda;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Test {
static class User{
String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
public static void main(String[] args) {
List<User> users = new ArrayList<>();
User user1 = new User();
user1.setUsername("张三");
User user2 = new User();
user2.setUsername("小四");
User user3 = new User();
user3.setUsername("小五");
User user4 = new User();
user4.setUsername("赵六");
users.add(user2);
users.add(user1);
users.add(user4);
users.add(user3);
/**
* 默认下的排序 排序结果不正确
* 小五
* 小四
* 张三
* 赵六
* */
Collections.sort(users,(u1,u2)->{
if (u1.getUsername().compareTo(u2.getUsername())>=0){
return 1;
}
return -1;
});
users.forEach(u-> System.out.println(u.getUsername()));
/**
* 用户名按中文拼音排序 排序结果
* 小四
* 小五
* 张三
* 赵六
* */
//定义中文排序器
Comparator<Object> chinese= Collator.getInstance(Locale.CHINA);
Collections.sort(users,(u1,u2)->{
if (chinese.compare(u1.getUsername(), u2.getUsername())>=0){
return 1;
}
return -1;
});
users.forEach(u-> System.out.println(u.getUsername()));
}
}
这里的排序器也可以使用其他国家语言的,其实将Comparator chinese= Collator.getInstance(Locale.CHINA);替换成Comparator chinese= Collator.getInstance();也能得到一样的结果,它会通过Locale.getDefault()获取当前的地区,去调用另外一个构造方法
static public final Locale SIMPLIFIED_CHINESE = createConstant("zh", "CN");//与Locale.getDefault()的值相对应
/** Useful constant for country.
*/
static public final Locale CHINA = SIMPLIFIED_CHINESE;
/** Useful constant for country.
/**
* Gets the Collator for the current default locale.
* The default locale is determined by java.util.Locale.getDefault.
* @return the Collator for the default locale.(for example, en_US)
* @see java.util.Locale#getDefault
*/
public static synchronized Collator getInstance() {
return getInstance(Locale.getDefault());//此时Locale.getDefault()的值为zh_CN 同时可以看到该方法是被synchronized修饰,是线程安全的
}
ps:对于lambda的使用,在线上部署时,需要注意服务器的jdk环境版本是不是符合要求,由于lambda是jdk1.8的新特性,在jdk1.8版本下会报错,在jdk1.8版本以下,新增的特性除了有lambda表达式,还有函数式接口、Stream流等等,具体jdk1.8新特性可参考此篇博文:JDK1.8 新特性
有时候我们想用lambda表达式遍历到某个元素后就终止循环:lambda跳出循环