使用Lambda表达式对中文拼音排序(按中文字典排序)

使用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跳出循环

你可能感兴趣的:(Java)