Guava-流式风格比较器Ordering

2024-04-21 07:08

本文主要是介绍Guava-流式风格比较器Ordering,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Ordering是Guava流畅风格比较器[Comparator]的实现,它可以用来为构建复杂的比较器,以完成集合排序的功能。从实现上说,Ordering实例就是一个特殊的Comparator实例。Ordering把很多基于Comparator的静态方法包装为自己的实例方法,并且提供了链式调用方法,来定制和增强现有的比较器。
创建排序器:

  1. natural() 对可排序类型做自然排序,如数字按大小,日期按先后排序
  2. usingToString() 按对象的字符串形式做字典排序
  3. from(Comparator) 把给定的Comparator转化为排序器

常用方法:

  1. reverse() 获取语义相反的排序器
  2. nullsFirst() 使用当前排序器,但额外把null值排到最前面。
  3. nullsLast() 使用当前排序器,但额外把null值排到最后面。
  4. compound(Comparator) 合成另一个比较器,以处理当前排序器中的相等情况。
  5. lexicographical() 基于处理类型T的排序器,返回该类型的可迭代对象Iterable的排序器。
  6. onResultOf(Function) 对集合中元素调用Function,再按返回值用当前排序器排序。

运用排序器:

  1. greatestOf(Iterable iterable, int k) 获取可迭代对象中最大的k个元素。
  2. isOrdered(Iterable) 判断可迭代对象是否已按排序器排序:允许有排序值相等的元素。
  3. sortedCopy(Iterable) 判断可迭代对象是否已严格按排序器排序:不允许排序值相等的元素.
  4. min(E, E) 返回两个参数中最小的那个。如果相等,则返回第一个参数。
  5. min(E, E, E, E…) 返回多个参数中最小的那个。如果有超过一个参数都最小,则返回第一个最小的参数。
  6. min(Iterable) 返回迭代器中最小的元素。如果可迭代对象中没有元素,则抛出NoSuchElementException。

Demo如下:

import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import com.google.common.primitives.Ints;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class StudentByAge implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {return Ints.compare(o1.getAge(), o2.getAge());}public static void main(String[] args) {StudentByAge studentByAge = new StudentByAge();StudentByScore studentByScore = new StudentByScore();Student s1 = new Student("Li", 21, 55.0);Student s2 = new Student("Zhang", 22, 65.0);Student s3 = new Student("Wang", 20, 78.5);Student s4 = new Student("Sun", 21, 88.0);Student s5 = new Student("Wang", 20, 75.0);List<Student> students = Lists.newArrayList(s1, s2, s3, s4, s5);/*** 根据年龄排序正序*/Ordering<Student> orderByAge = Ordering.from(studentByAge);Collections.sort(students, orderByAge);for (Student item : students) {System.out.println(item);}System.out.println("-----------------------------------------------------");/*** 根据年龄排序倒叙*/Ordering<Student> orderByAgeReverse = Ordering.from(studentByAge).reverse();Collections.sort(students, orderByAgeReverse);for (Student item : students) {System.out.println(item);}System.out.println("-----------------------------------------------------");/*** 先根据年龄排序,再根据分数排序*/Ordering<Student> oderByAgeAndScore = Ordering.from(studentByAge).compound(studentByScore);Collections.sort(students, oderByAgeAndScore);for (Student item : students) {System.out.println(item);}System.out.println("-----------------------------------------------------");/*** 找出分数最高的两个同学*/Ordering<Student> oderByScore = Ordering.from(studentByScore);List<Student> topTwo = oderByScore.greatestOf(students, 2);for (Student item : topTwo) {System.out.println(item);}}
}
import com.google.common.primitives.Doubles;
import java.util.Comparator;
public class StudentByScore implements Comparator<Student> {@Overridepublic int compare(Student s1, Student s2) {return Doubles.compare(s1.getScore(), s2.getScore());}
}
public class Student {private String name;private Integer age;private Double score;public Student(String name, Integer age, Double score) {this.name = name;this.age = age;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public Double getScore() {return score;}public void setScore(Double score) {this.score = score;}@Overridepublic String toString() {final StringBuffer sb = new StringBuffer("Student{");sb.append("name='").append(name).append('\'');sb.append(", age=").append(age);sb.append(", score=").append(score);sb.append('}');return sb.toString();}
}

这篇关于Guava-流式风格比较器Ordering的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/922453

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

关键字synchronized、volatile的比较

关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synchronized可以修饰方法,以及代码块。随着JDK新版本的发布,synchronized关键字的执行效率上得到很大提升,在开发中使用synchronized关键字的比率还是比较大的。多线程访问volatile不会发生阻塞,而synchronize

Java后端微服务架构下的API限流策略:Guava RateLimiter

Java后端微服务架构下的API限流策略:Guava RateLimiter 大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 在微服务架构中,API限流是保护服务不受过度使用和拒绝服务攻击的重要手段。Guava RateLimiter是Google开源的Java库中的一个组件,提供了简单易用的限流功能。 API限流概述 API限流通过控制请求的速率来防止

在 Qt Creator 中,输入 /** 并按下Enter可以自动生成 Doxygen 风格的注释

在 Qt Creator 中,当你输入 /** 时,确实会自动补全标准的 Doxygen 风格注释。这是因为 Qt Creator 支持 Doxygen 以及类似的文档注释风格,并且提供了代码自动补全功能。 以下是如何在 Qt Creator 中使用和显示这些注释标记的步骤: 1. 自动补全 Doxygen 风格注释 在 Qt Creator 中,你可以这样操作: 在你的代码中,将光标放在

stl的sort和手写快排的运行效率哪个比较高?

STL的sort必然要比你自己写的快排要快,因为你自己手写一个这么复杂的sort,那就太闲了。STL的sort是尽量让复杂度维持在O(N log N)的,因此就有了各种的Hybrid sort algorithm。 题主你提到的先quicksort到一定深度之后就转为heapsort,这种是introsort。 每种STL实现使用的算法各有不同,GNU Standard C++ Lib

一个图形引擎的画面风格是由那些因素(技术)决定的?

可能很多人第一直覺會認為shader決定了視覺風格,但我認為可以從多個方面去考慮。 1. 幾何模型 一個畫面由多個成分組成,最基本的應該是其結構,在圖形學中通常稱為幾何模型。 一些引擎,如Quake/UE,有比較強的Brush建模功能(或應稱作CSG),製作建築比較方便。而CE則有較強的大型地表、植被、水體等功能,做室外自然環境十分出色。而另一些遊戲類型專用的引擎,例

研究生生涯中一些比较重要的网址

Mali GPU相关: 1.http://malideveloper.arm.com/resources/sdks/opengl-es-sdk-for-linux/ 2.http://malideveloper.arm.com/resources/tools/arm-development-studio-5/ 3.https://www.khronos.org/opengles/sdk/do

性能测试工具 wrk,ab,locust,Jmeter 压测结果比较

前言 在开发服务端软件时,经常需要进行性能测试,一般我采用手写性能测试代码的方式进行测试,那有什么现成的好的性能测试工具吗? 性能测试工具 wrk,ab,locust,Jmeter 压测结果比较 详见: 性能测试工具 wrk,ab,locust,Jmeter 压测结果比较 Jmeter性能测试 入门

MongoDB学习—(6)MongoDB的find查询比较符

首先,先通过以下函数向BookList集合中插入10000条数据 function insertN(obj,n){var i=0;while(i<n){obj.insert({id:i,name:"bookNumber"+i,publishTime:i+2000})i++;}}var BookList=db.getCollection("BookList")调用函数,这样,BookList

风格控制水平创新高!南理工InstantX小红书发布CSGO:简单高效的端到端风格迁移框架

论文链接:https://arxiv.org/pdf/2408.16766 项目链接:https://csgo-gen.github.io/ 亮点直击 构建了一个专门用于风格迁移的数据集设计了一个简单但有效的端到端训练的风格迁移框架CSGO框架,以验证这个大规模数据集在风格迁移中的有益效果。引入了内容对齐评分(Content Alignment Score,简称CAS)来评估风格迁移