首页 > 解决方案 > Java 8 Streams,将一个元素放在列表的顶部,然后按名称的字母顺序排序

问题描述

我有一个项目列表(用户 ID)

List<String> userUid= Arrays.asList("uid1", "uid3", "uid5", "uid2", "uid4", "uid0");

如何将例如“uid2”放在列表顶部,然后对列表进行排序?因此,新列表将是:

uid2,uid0,uid1,uid3,uid4,uid5。

我试过没有成功userUid.sort(Comparator.comparing("uid2"::equals).reversed());

这样做的问题是它将在列表顶部显示旧列表的最后一个元素。

为了解释更多,我想制作一个用户列表,我想在这个列表的顶部显示登录的用户。然后按字母顺序对列表进行排序。

标签: javajava-8

解决方案


您可以为此编写一个自定义比较器:

Comparator<String> comparator = (o1, o2) -> {
     if (o1.equals("uid2")) return -1;
     if (o2.equals("uid2"))return 1;
     return o1.compareTo(o2);
   };
Collections.sort(userUid,comparator);

或者你可以这样做:

List<String> res =  userUid.stream().sorted()
       .filter(u -> !u.equals("uid2"))
       .collect(ArrayList::new,
              (l, s) ->{if (l.isEmpty())l.add("uid2");l.add(s);},
              List::addAll );

推荐阅读