哦,那些狡猾的Java8条带有lambdas的溪流。它们非常强大,但是复杂的东西需要一点时间来包裹它。
假设我有一个User
类型,其属性为User.getName()
。假设我有这些用户的地图Map
那么,如何获得地图中按用户名排序的用户列表呢?我可以忽略贴图键并执行以下操作:
return userMap.values()
.stream()
.sorted((u1, u2) -> {
return UserNameComparator.INSTANCE.compare(u1.getName(), u2.getName());
})
.collect(Collectors.toList());
但这一行我必须提取名称才能使用UserNameComparator。实例看起来像是太多的手工工作。是否有任何方法可以简单地将User::getName作为一些映射函数提供,仅用于排序,并且仍然将User实例返回到收集的列表中?
好处:如果我想排序的东西有两个层次,比如<代码>用户。getProfile()。getUsername()
?
为了在第二级进行比较,您可以这样进行:对于对象
public class ArticleChannel {
private Long id;
private String label;
private ArticleBusiness business;
}
public class ArticleBusiness {
private Long id;
private String name;
}
articleChannelList.sort(Comparator.comparing((ArticleChannel articleChannel) -> **articleChannel.getBusiness().getName()**).thenComparing(ArticleChannel::getLabel));
你想要的是比较器#比较
:
userMap.values().stream()
.sorted(Comparator.comparing(User::getName, UserNameComparator.INSTANCE))
.collect(Collectors.toList());
对于问题的第二部分,您可以使用
Comparator.comparing(
u->u.getProfile().getUsername(),
UserNameComparator.INSTANCE
)
问题内容: 我正在尝试按属性对一些数据进行排序。这是我tought应该可以工作的示例,但事实并非如此。 HTML部分: JS部分: 结果: A-> AData B-> BData C-> C数据 …恕我直言,应如下所示: C-> C数据 B-> BData A-> AData 我是否错过了某些东西(可以在这里进行JSFiddle的实验)? 问题答案: AngularJS的orderBy过滤器仅支持
问题内容: 哦,那些带有lambda的棘手的Java 8流。它们非常强大,但是复杂性要花一点点头才能将其包起来。 假设我有一个带有属性的类型。假设我有一个与名称相关联的用户的地图(例如,登录用户名)。让我们进一步说一下,我有一个比较器的实例来对用户名进行排序(也许使用花哨的排序器等)。 那么,如何获取地图中按用户名排序的用户列表?我可以忽略地图键并执行以下操作: 但是我不得不提取名称才能使用的那一
问题内容: 我现在只需获取数组的前3个对象并映射它们: 每个都有一个属性(champ.level)。 如何将输出分类到 前三个切片中? 问题答案: 与自定义比较功能一起使用时,首先要进行降序排序: 使用ES6甚至更好:
我有一些对象的列表。我想先按一些属性和空值排序,比如在查询中: 我知道当我有字符串列表时,我可以这样做: 但是当我有一些类的对象列表时呢? 有什么建议我可以用java实现吗?
问题内容: 我有这样的记录: 如何在hstore中按 任何 属性的最大值/最小值对它们进行排序? 结果应如下所示(按最低顺序排列): 我知道,我只能按如下特定属性来排序它们:,但不适用于我的问题。 问题答案: 使用转换为数组并将结果数组从文本转换为整数。然后对数组进行排序,并按排序后的数组的第一个元素对结果进行排序。 http://sqlfiddle.com/#!15/84f31/5
要做到这一点,最干净的捷径是什么? 我知道它可以通过自定义比较器来实现。对于这种情况,难道没有现成的东西吗? 有点像这样: