1. 程式人生 > >Google Guava 工具集__3__ Ordering犀利的比較器 Object方法

Google Guava 工具集__3__ Ordering犀利的比較器 Object方法


Ordering是Guava類庫提供的一個犀利強大的比較器工具,Guava的Ordering和JDK Comparator相比功能更強。它非常容易擴充套件,可以輕鬆構造複雜的comparator,然後用在容器的比較、排序等操作中。

  本質上來說,Ordering 例項無非就是一個特殊的Comparator 例項。Ordering只是需要依賴於一個比較器(例如,Collections.max)的方法,並使其可作為例項方法。另外,Ordering提供了鏈式方法呼叫和加強現有的比較器。

Comparator, Comparable區別

/*
     * Comparator, Comparable區別
     * <p>
     * 1.comparable是通用的介面,使用者可以實現它來完成自己特定的比較,
     *      而comparator可以看成一種演算法的實現,在需要容器集合 collection需要比較功能的時候,來指定這個比較器。
     * 2.一個類實現了Camparable介面表明這個類的物件之間是可以相互比較的。
     *      如果用數學語言描述的話就是這個類的物件組成的集合中存在一個全序。這樣,這個類物件組成的集合就可以使用Sort方法排序了。
     * 3.而Comparator的作用有兩個:
     *  a,如果類的設計師沒有考慮到Compare的問題而沒有實現Comparable介面,可以通過Comparator來實現比較演算法進行排序
     *  b,可以更加靈活實現排序規則,為了使用不同的排序標準做準備,比如:升序、降序,或者將來想通過類的其他欄位進行排序
     *
     * 例如:在對List 排序時候預設使用comparable的compareTo(Object o)方法
     *      但在比較某個物件下的屬性時候,我們可以自定義一個Comparator的compare(Object o1, Object o2)方法比較器進行比較
     *      Collections 中的 public static <T> void sort(List<T> list, Comparator<? super T> c) 方法
     *
     */
    private class ComparableAndComparatorDistinction implements Comparator, Comparable {

        /*
         * 重寫Comparable中的方法
         */
        @Override
        public int compareTo(Object o) {
            return 0;
        }

        /*
         * 重寫Comparator中的方法
         */
        @Override
        public int compare(Object o1, Object o2) {
            return 0;
        }
    }


Ordering犀利的比較器


程式碼演示


package com.framework_technology.commons.google.base;

import com.google.common.base.Function;
import com.google.common.base.Objects;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
import org.slf4j.LoggerFactory;

import java.util.Arrays;
import java.util.List;

/**
 * 部分Object 方法
 * <p>
 * Ordering犀利的比較器
 *
 * @author wei.Li by 14-8-27.
 */
public class ObjectMethodsAndOrdering {

    /**
     * 當一個物件中的欄位可以為null時,實現Object.equals方法會很痛苦,因為不得不分別對它們進行null檢查。
     * 使用Objects.equal幫助你執行null敏感的equals判斷,從而避免丟擲NullPointerException。
     * <p>
     * 注意:JDK7引入的Objects類提供了一樣的方法Objects.equals。
     */
    private static void objectsEqual() {
        Objects.equal("a", "a"); // returns true
        Objects.equal(null, "a"); // returns false
        Objects.equal("a", null); // returns false
        Objects.equal(null, null); // returns true

        Objects.hashCode("a", "b");//
    }

    /**
     * 用物件的所有欄位作雜湊[hash]運算應當更簡單。
     * Guava的Objects.hashCode(Object...)會對傳入的欄位序列計算出合理的、順序敏感的雜湊值。
     * 你可以使用Objects.hashCode(field1, field2, …, fieldn)來代替手動計算雜湊值。
     * <p>
     * 注意:JDK7引入的Objects類提供了一樣的方法Objects.hash(Object...)
     */
    private static void objectsHashCode() {
        Objects.equal("a", "a"); // returns true
        Objects.equal(null, "a"); // returns false
        Objects.equal("a", null); // returns false
        Objects.equal(null, null); // returns true

        Objects.hashCode("a", "b");//
    }


    /**
     * 實現一個比較器[Comparator]
     * JDK 與 Guava的實現的不同
     */
    private class Person2compareToTest implements Comparable<Person2compareToTest> {
        private String lastName;
        private String firstName;
        private int zipCode;

        /**
         * jdk 方式的比較
         *
         * @param other
         * @return
         */
        @Override
        public int compareTo(Person2compareToTest other) {
            int cmp = lastName.compareTo(other.lastName);
            if (cmp != 0) {
                return cmp;
            }
            cmp = firstName.compareTo(other.firstName);
            if (cmp != 0) {
                return cmp;
            }
            return Integer.compare(zipCode, other.zipCode);
        }

        /**
         * Guava的實現
         * <p>
         * ComparisonChain執行一種懶比較:它執行比較操作直至發現非零的結果,在那之後的比較輸入將被忽略。
         *
         * @param that 比較物件
         * @return 比較結果
         * @see #compareTo(Person2compareToTest)
         */
        public int compareToByComparisonChain(Person2compareToTest that) {
            return ComparisonChain.start()
                    .compare(this.lastName, that.lastName)
                    .compare(this.firstName, that.firstName)
                    .compare(this.zipCode, that.zipCode, Ordering.natural().nullsLast())
                    .result();
        }
    }


    /**
     * Ordering犀利的比較器演示
     * <p>
     * jdk8也實現了部分
     *
     * @see java.util.Comparators
     */
    private static class OrderTest implements Comparable<OrderTest> {

        private int id;
        private String name;

        public static final OrderTest[] ORDER_TESTS = new OrderTest[]{
                new OrderTest(1, "yiwa")
                , new OrderTest(11, "yiwa")
                , new OrderTest(2, "erwa")
                , new OrderTest(3, "sanwa")
                , new OrderTest(4, "siwa")
                , new OrderTest(5, "wuwa")
                , new OrderTest(5, "wuwa")
                , new OrderTest(6, null)
        };

        OrderTest(int id, String name) {
            this.id = id;
            this.name = name;
        }

        @Override
        public int compareTo(OrderTest that) {
            return ComparisonChain.start()
                    // .compare(this.id, that.id)
                    .compare(this, that, getOrdering())
                    .result()
                    ;
        }

        /**
         * 構建Ordering
         */
        private static Ordering<OrderTest> getOrdering() {

            return Ordering
                    .natural()
                    .nullsFirst()
                            //返回按String 排序的Comparable
                            //當閱讀鏈式呼叫產生的排序器時,應該從後往前讀。
                            // 下面的例子中,排序器首先呼叫apply方法獲取name值,並把name為null的元素都放到最前面,然後把剩下的元素按name進行自然排序。
                            // 之所以要從後往前讀,是因為每次鏈式呼叫都是用後面的方法包裝了前面的排序器。
                    .onResultOf(new Function<OrderTest, Comparable>() {
                        @Override
                        public Comparable apply(OrderTest input) {
                            return input.name;
                        }
                    })
                    // .leastOf(Arrays.asList(ORDER_TESTS),2)
                    ;
        }


        /**
         * 運用選擇器進行一些計算
         */
        private static void appleOrdering() {
            Ordering ordering = getOrdering();
            List<OrderTest> orderTestList
                    = Lists.newArrayList(ORDER_TESTS);

            //判斷可迭代物件是否已按排序器排序:允許有排序值相等的元素。
            boolean orderingOrdered = ordering.isOrdered(orderTestList);
            LOGGER.info("isOrdered          : <{}>", orderingOrdered);

            //判斷可迭代物件是否已按排序器嚴格排序:不允許有排序值相等的元素。
            boolean orderingStrictlyOrdered = ordering.isStrictlyOrdered(orderTestList);
            LOGGER.info("isStrictlyOrdered  : <{}>", orderingStrictlyOrdered);

            //返回指定的元素作為一個列表的排序副本。immutableSortedCopy返回不可變的排序副本
            // LOGGER.info("sortedCopy  : <{}>", ordering.sortedCopy(orderTestList));

            //最大的2元素
            LOGGER.info("greatestOf 2 index : <{}>", ordering.greatestOf(orderTestList, 4));

            //獲取最大值,迭代比較大小後返回
            LOGGER.info("orderTestList max  : <{}>", ordering.max(orderTestList));
        }

        @Override
        public String toString() {
            return "OrderTest{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }

    }

    private static final org.slf4j.Logger LOGGER
            = LoggerFactory.getLogger(Optional_.class);

    public static void main(String[] args) {

        Arrays.sort(OrderTest.ORDER_TESTS);
        LOGGER.info("---------- ORDER_TESTS after sort start ----------");
        for (OrderTest orderTest : OrderTest.ORDER_TESTS) {
            LOGGER.info("<{}>", orderTest);
        }
        LOGGER.info("---------- ORDER_TESTS after sort end   ----------");

        LOGGER.info("\n---------- Apple Ordering start ----------");
        OrderTest.appleOrdering();
        LOGGER.info("---------- Apple Ordering end   ----------");

        /* main 函式執行結果
        ---------- ORDER_TESTS after sort start ----------
<OrderTest{id=6, name='null'}>
<OrderTest{id=2, name='erwa'}>
<OrderTest{id=3, name='sanwa'}>
<OrderTest{id=4, name='siwa'}>
<OrderTest{id=5, name='wuwa'}>
<OrderTest{id=5, name='wuwa'}>
<OrderTest{id=1, name='yiwa'}>
<OrderTest{id=11, name='yiwa'}>
---------- ORDER_TESTS after sort end   ----------

---------- Apple Ordering start ----------
isOrdered          : <true>
isStrictlyOrdered  : <false>
greatestOf 2 index : <[OrderTest{id=1, name='yiwa'}, OrderTest{id=11, name='yiwa'},
                      OrderTest{id=5, name='wuwa'}, OrderTest{id=5, name='wuwa'}]>
orderTestList max  : <OrderTest{id=1, name='yiwa'}>
---------- Apple Ordering end   ----------

         */
    }
}


相關推薦

Google Guava 工具__3__ Ordering犀利比較 Object方法

Ordering是Guava類庫提供的一個犀利強大的比較器工具,Guava的Ordering和JDK Comparator相比功能更強。它非常容易擴充套件,可以輕鬆構造複雜的comparator,然後用在容器的比較、排序等操作中。   本質上來說,Orderin

Guava學習筆記:Ordering犀利比較

  Ordering是Guava類庫提供的一個犀利強大的比較器工具,Guava的Ordering和JDK Comparator相比功能更強。它非常容易擴充套件,可以輕鬆構造複雜的comparator,然後用在容器的比較、排序等操作中。   本質上來說,Ordering 例項無非就是一個特殊的Comparat

學習Google guava工具

1、前言 好的工具類能節約開發者的開發成本,今天學習一個新的工具類guava。guava是谷歌出品的一款開源java工具類,提供一些常用的方法。以下指示一些常用的方法,guava還提供其他的一些方法,可以通過線上API自行學習。 2、座標 <dependency>  &n

Google guava工具類的介紹和使用

轉載自 http://blog.csdn.net/yyychyzzzz/article/details/54983574概述工具類 就是封裝平常用的方法,不需要你重複造輪子,節省開發人員時間,提高工作效率。谷歌作為大公司,當然會從日常的工作中提取中很多高效率的方法出來。所以就

Google guava cache原始碼解析1--構建快取(2)

此文已由作者趙計剛授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 CacheBuilder-->maximumSize(long size)     /**      * 

Google guava cache原始碼解析1--構建快取(3)

此文已由作者趙計剛授權網易雲社群釋出。 歡迎訪問網易雲社群,瞭解更多網易技術產品運營經驗。 下面介紹在LocalCache(CacheBuilder, CacheLoader)中呼叫的一些方法: CacheBuilder-->getConcurrencyLevel()

[Google Guava] 1-4 排序: Guava強大的”流暢風格比較

判斷 cal java width reverse right col tor res 原文鏈接 譯者: 沈義揚 排序器[Ordering]是Guava流暢風格比較器[Comparator]的實現,它可以用來為構建復雜的比較器,以完成集合排序的功能。 從實現上說,Orde

GuavaOrdering比較

簡介 Ordering是Guava類庫提供的一個犀利強大的比較器工具,Guava的Ordering和JDK Comparator相比功能更強。它非常容易擴充套件,可以輕鬆構造複雜的comparator,然後用在容器的比較、排序等操作中。 本質上來說,Order

[Google Guava] 排序: Guava強大的”流暢風格比較

原文連結 譯者: 沈義揚 排序器[Ordering]是Guava流暢風格比較器[Comparator]的實現,它可以用來為構建複雜的比較器,以完成集合排序的功能。 從實現上說,Ordering例項就是一個特殊的Comparator例項。Ordering把很多基於Comparator的靜態方法(

[Google Guava] 2.4-集合擴充套件工具

原文連結 譯文連結 譯者:沈義揚,校對:丁一 簡介 有時候你需要實現自己的集合擴充套件。也許你想要在元素被新增到列表時增加特定的行為,或者你想實現一個Iterable,其底層實際上是遍歷資料庫查詢的結果集。Guava為你,也為我們自己提供了若干工具方法,以便讓類似的工作變得更簡單。(畢竟,我們

[Google Guava] 2.3-強大的集合工具類:java.util.Collections中未包含的集合工具

原文連結 譯文連結 譯者:沈義揚,校對:丁一 尚未完成: Queues, Tables工具類 任何對JDK集合框架有經驗的程式設計師都熟悉和喜歡java.util.Collections包含的工具方法。Guava沿著這些路線提供了更多的工具方法:適用於所有集合的靜態方法。這是Guava最流行和

Ordering犀利比較

Ordering是Guava類庫提供的一個犀利強大的比較器工具,Guava的Ordering和JDK Comparator相比功能更強。它非常容易擴充套件,可以輕鬆構造複雜的comparator,然後用在容器的比較、排序等操作中。 本質上來說,Ordering 例項無非就是一個特殊的Co

企業開發——googleGuava工具

 1.Guava之MultiMap 相信大家對Java中的Map類及其之類有大致的瞭解,Map類是以鍵值對的形式來儲存元素(Key->Value),但是熟悉Map的人都知 道,Map中儲存的Key是唯一的。什麼意思呢?就是假如我們有兩個key相同,但value不同的元

Guava鏈式風格Ordering比較例項

1.簡介 Ordering 例項無非就是一個特殊的Comparator 例項。Ordering只是需要依賴於一個比較器(例如,Collections.max)的方法,並使其可作為例項方法。另外,Ordering提供了鏈式方法呼叫和加強現有的比較器,可以輕鬆構造

[Google Guava]--Ordering

簡介:Ordering(排序)可以被看作是一個豐富的比較具有增強功能的連結,多個實用方法,多型別排序功能等。類宣告以下是com.google.common.collect.Ordering<T>類的宣告:@GwtCompatible public abstract

Google Guava學習(10)-Guava字串工具CharMatcher

1. 功能:處理字串 2. 程式碼: package com.example.google.guava.demo.string; import com.google.common.base.CharMatcher; /** * <p> * <cod

[Google Guava]--java.util.Collections中未包含的集合工具(com.google.common.collect)

任何對JDK集合框架有經驗的程式設計師都熟悉和喜歡java.util.Collections包含的工具方法。Guava沿著這些路線提供了更多的工具方法:適用於所有集合的靜態方法。這是Guava最流行和成熟的部分之一。我們用相對直觀的方式把工具類與特定集合介面的對應關係歸納如下

使用GoogleGuava工具EventBus-觀察者模式

EventBus是Google.Guava提供的訊息釋出-訂閱類庫,它實現了觀察者設計模式,訊息通知負責人通過EventBus去註冊/登出觀察者,最後由訊息通知負責人給觀察者釋出訊息。首先使用 maven 依賴:<!-- https://mvnrepository.co

Java-類庫-Guava-Ordering比較

 Ordering是Guava類庫提供的一個犀利強大的比較器工具,Guava的Ordering和JDK Comparator相比功能更強。它非常容易擴充套件,可以輕鬆構造複雜的comparator,然後用在容器的比較、排序等操作中。   本質上來說,Order

Google-Guava學習:排序Ordering

排序器[Ordering]是Guava流暢風格比較器[Comparator]的實現,它可以用來為構建複雜的比較器,以完成集合排序的功能。從實現上說,Ordering例項就是一個特殊的Comparator例項。Ordering把很多基於Comparator的