使用java 8从map中使用比较器和crieria进行排序
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了使用java 8从map中使用比较器和crieria进行排序,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1637字,纯文字阅读大概需要3分钟。
内容图文
![使用java 8从map中使用比较器和crieria进行排序](/upload/InfoBanner/zyjiaocheng/779/a18ae7d776e84a4191b6c291d9c9b8d0.jpg)
让我们考虑一个具有20个属性的java类Parent(attrib1,attrib2 .. attrib20)及其相应的getter和setter.
列表与LT;家长和GT; list包含n个Parent对象.
现在我想根据多个标准对此列表进行排序.我将使用比较器接口来构建排序标准.
排序arrtibute存储为映射.
Map< AttributeName, Ascending/Decending>
所以我想为每个键迭代map和bulid比较器接口.
我们如何迭代map并为每个键构建比较器接口,然后连接这些比较器接口.
我接受纯java 8代码来解决这个问题.
解决方法:
除非你使用反射,否则不可能实现这一点.此外,如果您不使用LinkedHashMap或者属性的名称没有按字典或其他定义的顺序链接,以确保您以正确的顺序链接它们,那么将无法检索您想要的那个链首先.
说实话,使用反射似乎更像是一个黑客.我认为你可以改进你的设计.
我建议创建一个LinkedHashMap< String,Comparator< Parent>> map = new HashMap<>();(如果你不需要一个LinkedHashSet就足够了),你可以从那里按照你想要链接它们的顺序插入比较器.
然后你正在寻找减少.迭代条目集的值,然后通过减少它们来链接比较器:
Comparator<Parent> cmp = map.entrySet()
.stream()
.map(Map.Entry::getValue)
.reduce(Comparator::thenComparing)
.get(); //check also orElse, orElseThrow, etc.
如果您的Map不是LinkedHashMap,但可以比较键以获得所需的链,则可以使用.sorted(Map.Entry.comparingByKey())对流进行排序.
您可以拥有Map< String,SimpleEntry< Comparator< Parent> ;, Boolean>>如果你想存储逻辑升序/降序,你只需要添加另一个映射操作:
...
.map(Map.Entry::getValue)
.map(e -> e.getValue() ? e.getKey().reversed() : e.getKey())
...
所以这样一个地图的例子可能是
Map<String, SimpleEntry<Comparator<Parent>, Boolean>> map = new HashMap<>();
map.put("id", new SimpleEntry<>(Comparator.comparingInt(Parent::getId), true));
map.put("name", new SimpleEntry<>(Comparator.comparing(Parent::getName), false));
内容总结
以上是互联网集市为您收集整理的使用java 8从map中使用比较器和crieria进行排序全部内容,希望文章能够帮你解决使用java 8从map中使用比较器和crieria进行排序所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。