当前位置: 首页 > 面试题库 >

在Java 8流中按属性排序

阴禄
2023-03-14
问题内容

哦,那些带有lambda的棘手的Java 8流。它们非常强大,但是复杂性要花一点点头才能将其包起来。

假设我有一个User带有属性的类型User.getName()。假设我有一个Map<String, User>与名称相关联的用户的地图(例如,登录用户名)。让我们进一步说一下,我有一个比较器的实例UserNameComparator.INSTANCE来对用户名进行排序(也许使用花哨的排序器等)。

那么,如何获取地图中按用户名排序的用户列表?我可以忽略地图键并执行以下操作:

return userMap.values()
    .stream()
    .sorted((u1, u2) -> {
      return UserNameComparator.INSTANCE.compare(u1.getName(), u2.getName());
    })
    .collect(Collectors.toList());

但是我不得不提取名称才能使用的那一行UserNameComparator.INSTANCE似乎是太多的手工工作。我有什么办法可以简单地提供User::getName一些映射功能(仅用于排序),又可以将User实例返回到已收集列表中?

奖励:如果我要分类的东西深达两个层次,该User.getProfile().getUsername()怎么办?


问题答案:

您想要的是Comparator#comparing

userMap.values().stream()
    .sorted(Comparator.comparing(User::getName, UserNameComparator.INSTANCE))
    .collect(Collectors.toList());

对于问题的第二部分,您只需使用

Comparator.comparing(
    u->u.getProfile().getUsername(), 
    UserNameComparator.INSTANCE
)


 类似资料:
  • 哦,那些狡猾的Java8条带有lambdas的溪流。它们非常强大,但是复杂的东西需要一点时间来包裹它。 假设我有一个类型,其属性为。假设我有这些用户的地图 ?

  • 问题内容: 我正在尝试按属性对一些数据进行排序。这是我tought应该可以工作的示例,但事实并非如此。 HTML部分: JS部分: 结果: A-> AData B-> BData C-> C数据 …恕我直言,应如下所示: C-> C数据 B-> BData A-> AData 我是否错过了某些东西(可以在这里进行JSFiddle的实验)? 问题答案: AngularJS的orderBy过滤器仅支持

  • 问题内容: 我有这样的记录: 如何在hstore中按 任何 属性的最大值/最小值对它们进行排序? 结果应如下所示(按最低顺序排列): 我知道,我只能按如下特定属性来排序它们:,但不适用于我的问题。 问题答案: 使用转换为数组并将结果数组从文本转换为整数。然后对数组进行排序,并按排序后的数组的第一个元素对结果进行排序。 http://sqlfiddle.com/#!15/84f31/5

  • 我有一个类具有以下签名: 我想将映射到在单个流中同时包含stringA和stringB的 或: 当然他们都不编译,但你明白了。 编辑: 示例:

  • 问题内容: 我现在只需获取数组的前3个对象并映射它们: 每个都有一个属性(champ.level)。 如何将输出分类到 前三个切片中? 问题答案: 与自定义比较功能一起使用时,首先要进行降序排序: 使用ES6甚至更好:

  • 我有map,我想有一个列表,它按键的对应值排序(最小到最大)。我的尝试是: