Table of Contents
ToggleComparator in Java with Examples
只有一個抽象方法的接口,定義了 compare 方法,可以在一個元素上測試或應用一些操作,常用於集合或陣列比較元素,例如:從小到大或大到小排序,取代傳統實作接口的方法,讓程式碼更加簡潔和易讀, Comparator in Java 本篇增加了範例,並透過單元測試來驗證產出結果。
o1 大於 o2 傳回 1 。
o1 等於 o2 傳回 0 。
o1 小於 o2 傳回 -1 。
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- comparator
| +- ComparatorWithExamplesTest.java
單元測試
Comparator Java 提供 comparingInt 、 naturalOrder 條件或組合成鏈式判斷等操作 Comparator 。
Fruit
建立 Fruit 類別,覆寫 equals 、 hashCode ,定義屬性和方法,用來建立一個物件。
@NoArgsConstructor
@Getter
@Setter
@Builder
public static class Fruit {
private String name;
private double quantity;
private int type;
public Fruit(String name, double quantity, int type) {
this.name = name;
this.quantity = quantity;
this.type = type;
}
public String toString() {
ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.JSON_STYLE);
builder.appendSuper(super.toString());
builder.append("name", name);
builder.append("quantity", quantity);
builder.append("type", type);
return builder.toString();
}
public boolean equals(Object object) {
if (!(object instanceof Fruit)) {
return false;
}
if (this == object) {
return true;
}
Fruit other = (Fruit) object;
return new EqualsBuilder().append(getName(), other.getName()).isEquals();
}
public int hashCode() {
return new HashCodeBuilder().append(getName()).toHashCode();
}
}
comparingInt
Comparator Java 建立集合,比對元素,由小到大排序。
@Test
public void comparingInt() {
List<Fruit> list = Arrays.asList(new Fruit("Mango", 1.2, 2), new Fruit("Peach", 1.1, 3),
new Fruit("Orange", 2, 1));
System.out.println(list);
list.sort(Comparator.comparingInt(Fruit::getType));
System.out.println(list);
assertEquals("Orange", list.get(0).getName());
assertEquals("Mango", list.get(1).getName());
assertEquals("Peach", list.get(2).getName());
}
[{"name":"Mango","quantity":1.2,"type":2}, {"name":"Peach","quantity":1.1,"type":3}, {"name":"Orange","quantity":2.0,"type":1}]
[{"name":"Orange","quantity":2.0,"type":1}, {"name":"Mango","quantity":1.2,"type":2}, {"name":"Peach","quantity":1.1,"type":3}]
comparingLong
Comparator Java 建立集合,比對元素,由小到大排序。
@Test
public void comparingLong() {
List<Long> list = Arrays.asList(3L, 1L, 5L, 9L, 7L);
System.out.println(list);
list.sort(Comparator.comparingLong(e -> e));
System.out.println(list);
assertEquals(1L, list.get(0).longValue());
assertEquals(3L, list.get(1).longValue());
assertEquals(5L, list.get(2).longValue());
}
[3, 1, 5, 9, 7]
[1, 3, 5, 7, 9]
comparingDouble
Comparator Java 建立集合,比對元素,由小到大排序。
@Test
public void comparingDouble() {
List<Fruit> list = Arrays.asList(new Fruit("Mango", 1.2, 2), new Fruit("Peach", 1.1, 3),
new Fruit("Orange", 2, 1));
System.out.println(list);
list.sort(Comparator.comparingDouble(Fruit::getQuantity));
System.out.println(list);
assertEquals("Peach", list.get(0).getName());
assertEquals("Mango", list.get(1).getName());
assertEquals("Orange", list.get(2).getName());
}
[{"name":"Mango","quantity":1.2,"type":2}, {"name":"Peach","quantity":1.1,"type":3}, {"name":"Orange","quantity":2.0,"type":1}]
[{"name":"Peach","quantity":1.1,"type":3}, {"name":"Mango","quantity":1.2,"type":2}, {"name":"Orange","quantity":2.0,"type":1}]
naturalOrder
Java Comparator 建立集合,比對元素,由小到大排序。
@Test
public void naturalOrder() {
List<String> list = Arrays.asList("Mango", "Peach", "Orange");
System.out.println(list);
list.sort(Comparator.naturalOrder());
System.out.println(list);
assertEquals("Mango", list.get(0));
assertEquals("Orange", list.get(1));
assertEquals("Peach", list.get(2));
}
[Mango, Peach, Orange]
[Mango, Orange, Peach]
reverseOrder
Java Comparator 建立集合,比對元素,由大到小排序。
@Test
public void reverseOrder() {
List<String> list = Arrays.asList("Mango", "Peach", "Orange");
System.out.println(list);
list.sort(Comparator.reverseOrder());
System.out.println(list);
assertEquals("Peach", list.get(0));
assertEquals("Orange", list.get(1));
assertEquals("Mango", list.get(2));
}
[Mango, Peach, Orange]
[Peach, Orange, Mango]
ComparatorWithExamplesTest.java
Java Comparator 新增單元測試,驗證 Java Comparator Example 是否符合預期。
package org.ruoxue.java_147.comparator;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import org.apache.commons.lang3.builder.EqualsBuilder;
import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import org.junit.Test;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
public class ComparatorWithExamplesTest {
@NoArgsConstructor
@Getter
@Setter
@Builder
public static class Fruit {
private String name;
private double quantity;
private int type;
public Fruit(String name, double quantity, int type) {
this.name = name;
this.quantity = quantity;
this.type = type;
}
public String toString() {
ToStringBuilder builder = new ToStringBuilder(this, ToStringStyle.JSON_STYLE);
builder.appendSuper(super.toString());
builder.append("name", name);
builder.append("quantity", quantity);
builder.append("type", type);
return builder.toString();
}
public boolean equals(Object object) {
if (!(object instanceof Fruit)) {
return false;
}
if (this == object) {
return true;
}
Fruit other = (Fruit) object;
return new EqualsBuilder().append(getName(), other.getName()).isEquals();
}
public int hashCode() {
return new HashCodeBuilder().append(getName()).toHashCode();
}
}
@Test
public void comparingInt() {
List<Fruit> list = Arrays.asList(new Fruit("Mango", 1.2, 2), new Fruit("Peach", 1.1, 3),
new Fruit("Orange", 2, 1));
System.out.println(list);
list.sort(Comparator.comparingInt(Fruit::getType));
System.out.println(list);
assertEquals("Orange", list.get(0).getName());
assertEquals("Mango", list.get(1).getName());
assertEquals("Peach", list.get(2).getName());
}
@Test
public void comparingLong() {
List<Long> list = Arrays.asList(3L, 1L, 5L, 9L, 7L);
System.out.println(list);
list.sort(Comparator.comparingLong(e -> e));
System.out.println(list);
assertEquals(1L, list.get(0).longValue());
assertEquals(3L, list.get(1).longValue());
assertEquals(5L, list.get(2).longValue());
}
@Test
public void comparingDouble() {
List<Fruit> list = Arrays.asList(new Fruit("Mango", 1.2, 2), new Fruit("Peach", 1.1, 3),
new Fruit("Orange", 2, 1));
System.out.println(list);
list.sort(Comparator.comparingDouble(Fruit::getQuantity));
System.out.println(list);
assertEquals("Peach", list.get(0).getName());
assertEquals("Mango", list.get(1).getName());
assertEquals("Orange", list.get(2).getName());
}
@Test
public void naturalOrder() {
List<String> list = Arrays.asList("Mango", "Peach", "Orange");
System.out.println(list);
list.sort(Comparator.naturalOrder());
System.out.println(list);
assertEquals("Mango", list.get(0));
assertEquals("Orange", list.get(1));
assertEquals("Peach", list.get(2));
}
@Test
public void reverseOrder() {
List<String> list = Arrays.asList("Mango", "Peach", "Orange");
System.out.println(list);
list.sort(Comparator.reverseOrder());
System.out.println(list);
assertEquals("Peach", list.get(0));
assertEquals("Orange", list.get(1));
assertEquals("Mango", list.get(2));
}
}
心得分享
Java Comparator Example 功能接口,使用 Lambda 語法,可當作其他方法的傳入參數或是引用其他方法為實例, Java Comparator 提供了幾種 Comparator 常見方法的操作範例,例如: comparingInt 、 naturalOrder 等方法。