哦,那些带有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,我想有一个列表,它按键的对应值排序(最小到最大)。我的尝试是: