Commons-Collections简介

如果你不熟悉Jakarta Commons话,那么很有可能你已经重新发明了好几个轮子。在你编写更多的普通的框架或工具之前,体验一下Commons吧。它将会大大地节约你的时间。太多的人自己写一个,其实是与Commons Lang中的StringUtils重复的StringUtils类,或者,开发者不知道从Commons Collections中重新创建工具,哪怕commons-collections.jar已经在classpath中可用了。
真的,请停一下。看看Commons Collections API,然后再回到你的任务中;我发誓你会发现一些简单有用的东西可以帮你在明年节省一周的时间。如果大家花一点时间看看Jakarta Commons,我们将会得到更少的重复代码—我们将在重用的宗旨下真正做一些有用的事情。

下面为大家介绍一下Commons-Collections的功能

一)此包的下载

http://download.csdn.net/detail/li295214001/8698921   此包目前最新的版本是commons-collections4-4.0

二)此包的功能

为Java标准的Collections API提供了相当好的补充。在此基础上对其常用的数据结构操作进行了很好的封装、抽象和补充。保证性能的同时大大简化代码。

三)此包的API

http://commons.apache.org/proper/commons-collections/javadocs/api-release/index.html

四)此包的分类:

根据集合类型,大致将此包的类归纳为9类:

Bag -- 在org.apache.commons.collections包中定义的接口,它extends java.util.Collection,而它的实现类都被放在下面的bag包中。HashBag是Bag接口的一个标准实现。而BagUtils提供一组static的方法让调用者获取经过不同装饰后的Bag实例.具体用法见代码样例

Buffer -- 定义在org.apache.commons.collections包下面的接口,用于表示按一定顺序除去成员对象的collection如队列等。具体的实现类在org.apache.commons.collections.buffer 包下可以找到。最简单直接的Buffer实现类是UnboundedFifoBuffer,提供先进先出的大小可变的队列。而BoundedFifoBuffer则是对其大小进行了限制,是固定大小的先进先出队列。BlockingBuffer要在多线程的环境中才能体现出它的价值,尤其是当我们需要实现某种流水线时这个BlockingBuffer很有用:每个流水线上的组件从上游的BlockingBuffer获取数据,处理后放到下一个BlockingBuffer中依次传递。BlockingBuffer的核心特色通俗点说就是如果你向它要东西,而它暂时还没有的话,你可以一直等待直至拿到为止。PriorityBuffer则提供比一般的先进先出Buffer更强的控制力:我们可以自定义Comparator给它,告诉它怎么判定它的成员的先后顺序,优先级最高的最先走。此外还有执行类型检查的TypedBuffer、或者不可改变的UnmodifiableBuffer等等

Map -- 在java.util.Map的基础上扩展的接口和类。BidiMap,直译就是双向Map,可以通过key找到value,也可以通过value找到key,这在我们日常的代码-名称匹配的时候很方便:因为我们除了需要通过代码找到名称之外,往往也需要处理用户输入的名称,然后获取其代码。需要注意的是BidiMap当中不光key不能重复,value也不可以。MultiMap,就是说一个key不在是简单的指向一个对象,而是一组对象,add()和remove()的时候跟普通的Map无异,只是在get()时返回一个Collection,利用MultiMap,我们就可以很方便的往一个key上放数量不定的对象,也就实现了一对多。LazyMap,意思就是这个Map中的键/值对一开始并不存在,当被调用到时才创建。

Collection -- 用也各collection之间的类型转换。典型的是TypedCollection,它实际上的作用就是提供一个decorate方法,我们传进去一个Collection和需要的类型甄别信息java.lang.Class,它给我们创建一个全新的强类型的Collection。(暂无样例代码,以后补充)

Comparator -- 提供了一些Comparator的实现类(都在org.apache.commons.collections.comparators包下面)BooleanComparator – 用于排序一组Boolean对象,指明先true还是先false;ComparableComparator – 用于排序实现了java.lang.Comparable接口的对象(我们常用的Java类如String、Integer、Date、Double、File、Character等等都实现了Comparable接口);ComparatorChain
– 定义一组Comparator链,链中的Comparator对象会被依次执行;FixedOrderComparator – 用于定义一个特殊的顺序,对一组对象按照这样的自定义顺序进行排序;NullComparator – 让null值也可参与比较,可以设定为先null或者后null;

ReverseComparator – 将原有的Comparator效果反转;TransformingComparator – 将一个Comparator装饰为具有Transformer效果的Comparator。

Predicate -- 它以一个Object对象为参数,处理后返回一个boolean值,检验某个对象是否满足某个条件。Commons Collections也提供了一组定义好的Predicate类供我们使用,这些类都放在org.apache.commons.collections.functors包中。当然,我们也可以自定义Predicate,只要实现这个Predicate接口即可。

Transformer -- 我们有时候需要将某个对象转换成另一个对象供另一组方法调用,而这两类对象的类型有可能并不是出于同一个继承体系的,或者说出了很基本的Object之外没有共同的父类,或者我们根本不关心他们是不是有其他继承关系,甚至就是同一个类的实例只是对我们而言无所谓,我们为了它能够被后续的调用者有意义的识别和处理,在这样的情形,我们就可以利用Transformer。除了基本的转型Transformer之外,Commons Collections还提供了Transformer链和带条件的Transformer,使得我们很方便的组装出有意义的转型逻辑。

Closure -- 这一组接口和类提供一个操作对象的execute方法,为我们在处理一系列对象时可以将处理逻辑分离出来。ChainedClosure可以包装一组Closure作为整体执行;IfClosure在创建时需要提供给它一个Predicate和两个Closure,执行时先做Predicate判定再决定执行哪一个Closure;SwitchClosure跟SwitchTransformer类似,根据创建时传入的Predicate组和Closure组对应执行;WhileClosure则根据创建时传入的Predicate做判断,如果为true则执行Closure,直到Predicate返回false;等等。

Iterator -- java.util.Iterator接口定义了标准的Collection遍历方法,但是如果不做改变的使用它,我们得到的是从头到尾一次性的遍历。假如我们需要循环遍历,假如我们需要遍历某一段,假如我们需要遍历满足某些条件的元素,等等等等,我们就不能完全依赖于这个Iterator的标准实现了。除非我们宁可在此基础上在调用的代码中多加一些判断,不过这样的话代码就会显得混乱,时间长了就容易变得难以维护。Commons Collections的这一组Iterator为我们带来了便利。

五)代码样例

1)Bag:

Java代码

/** Book.java */
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public class Book {
    private String name;
    private String isbn;
    private double retailPrice;

    public Book() {}
    public Book(String name, String isbn, double retailPrice) {
        this.name = name;
        this.isbn = isbn;
        this.retailPrice = retailPrice;
    }
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.MULTI_LINE_STYLE)
        .append("name", name)
        .append("ISBN", isbn)
        .append("retailPrice", retailPrice)
        .toString();
    }
    public String getIsbn() {
        return isbn;
    }
    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getRetailPrice() {
        return retailPrice;
    }
    public void setRetailPrice(double retailPrice) {
        this.retailPrice = retailPrice;
    }

}

/** BagUsage.java */
import org.apache.commons.collections.Bag;
import org.apache.commons.collections.BagUtils;
import org.apache.commons.collections.bag.HashBag;
import org.apache.commons.lang.StringUtils;

public class BagUsage {

    public static void main(String[] args) {
        demoBagUsage();
    }
    public static void demoBagUsage() {
        System.out.println(StringUtils.center(" demoBagUsage ", 40, "="));

        // data setup
        Book book1 = new Book("Refactoring Workbook", "7-5083-2208-8", 29.8);
        Book book2 = new Book("J2EE Design Patterns", "7-5083-3099-4", 45);
        Book book3 = new Book("Agile Software Development", "7-5083-1503-0", 59);

        // create a bag
        Bag myBag = BagUtils.typedBag(new HashBag(), Book.class);
        myBag.add(book1, 360); //Bag, add 360 book1s into myBag
        myBag.add(book2, 500); //Bag,add function
        myBag.add(book3, 170); //Bag,add function

        // calculations for a bag
        double price1 = book1.getRetailPrice();
        double price2 = book2.getRetailPrice();
        double price3 = book3.getRetailPrice();
        int book1Count = myBag.getCount(book1);//the count should be 360
        int book2Count = myBag.getCount(book2);//the count should be 500
        int book3Count = myBag.getCount(book3);//the count should be 170
        double totalValue = (price1 * book1Count) + (price2 * book2Count)
                + (price3 * book3Count);

        // dispaly results
        System.out.println("There are " + book1Count + " copies of "
                + book1.getName() + ".");
        System.out.println("There are " + book2Count + " copies of "
                + book2.getName() + ".");
        System.out.println("There are " + book3Count + " copies of "
                + book3.getName() + ".");
        System.out.println("The total value of these books is: " + totalValue);
        System.out.println();

    }
}

以下是运行结果:

============= demoBagUsage =============

There are 360 copies of Refactoring Workbook.

There are 500 copies of J2EE Design Patterns.

There are 170 copies of Agile Software Development.

The total value of these books is: 43258.0

2)Buffer:

Java代码

import java.util.Iterator;

import org.apache.commons.collections.Buffer;
import org.apache.commons.collections.BufferUtils;
import org.apache.commons.collections.buffer.BoundedFifoBuffer;
import org.apache.commons.lang.StringUtils;

public class BufferUsage {
    public static void main(String[] args) {
        demoBufferUsage();
    }
    public static void demoBufferUsage() {

        System.out.println(StringUtils.center(" demoBagUsage ", 40, "="));

        // data setup
        Book book1 = new Book("Refactoring Workbook", "7-5083-2208-8", 29.8);
        Book book2 = new Book("J2EE Design Patterns", "7-5083-3099-4", 45);
        Book book3 = new Book("Agile Software Development", "7-5083-1503-0", 59);
        Book book4 = new Book("Professional JSP", "7-5053-8005-2", 100);

        // create a Buffer
        Buffer buffer =
            BufferUtils.typedBuffer(new BoundedFifoBuffer(3), Book.class); //key line1
        buffer.add(book1);
        buffer.add(book2);
        buffer.add(book3);
        Book removed = (Book) buffer.remove();//key line2
        System.out.println("Removed:");
        System.out.println(removed);
        buffer.add(book4);//key line3

        // get items in buffer
        for (int i = 0; i < 3; i++) {
            System.out.println(buffer.get());
            buffer.remove();
        }
        System.out.println(StringUtils.repeat("=", 40));
    }
}

以下是运行结果:

============= demoBagUsage =============

Removed:

[email protected][

name=Refactoring Workbook

ISBN=7-5083-2208-8

retailPrice=29.8

]

Remaining:

[email protected][

name=J2EE Design Patterns

ISBN=7-5083-3099-4

retailPrice=45.0

]

[email protected][

name=Agile Software Development

ISBN=7-5083-1503-0

retailPrice=59.0

]

[email protected][

name=Professional JSP

ISBN=7-5053-8005-2

retailPrice=100.0

]

========================================

3)Map:

Java代码

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import org.apache.commons.collections.BidiMap;
import org.apache.commons.collections.Factory;
import org.apache.commons.collections.MultiHashMap;
import org.apache.commons.collections.MultiMap;
import org.apache.commons.collections.bidimap.DualHashBidiMap;
import org.apache.commons.collections.map.LazyMap;
import org.apache.commons.lang.StringUtils;

public class MapUsage {
    public static void main(String[] args) {
        demoBidiMap();
        demoMultiMap();
        demoLazyMap();
    }
    public static void demoBidiMap() {
        System.out.println(StringUtils.center(" demoBidiMap ", 40, "="));
        BidiMap bidiMap = new DualHashBidiMap();
        bidiMap.put("BJ", "Beijing");
        bidiMap.put("SH", "Shanghai");
        bidiMap.put("GZ", "Guangzhou");
        bidiMap.put("CD", "Chengdu");
        System.out.println("Key-Value: BJ = " + bidiMap.get("BJ"));
        System.out.println("Value-Key: Chengdu = " + bidiMap.getKey("Chengdu"));
        System.out.println(StringUtils.repeat("=", 40));
    }
    public static void demoMultiMap() {
        System.out.println(StringUtils.center(" demoMultiMap ", 40, "="));
        MultiMap multiMap = new MultiHashMap();
        multiMap.put("Sean", "C/C++");
        multiMap.put("Sean", "OO");
        multiMap.put("Sean", "Java");
        multiMap.put("Sean", ".NET");
        multiMap.remove("Sean", "C/C++");
        System.out.println("Sean's skill set: " + multiMap.get("Sean"));
        System.out.println(StringUtils.repeat("=", 40));
    }
    public static void demoLazyMap() {
        System.out.println(StringUtils.center(" demoLazyMap ", 40, "="));
        // borrowed from Commons Collection's Javadoc
        Factory factory = new Factory() {
            public Object create() {
                return new Date();
            }
        };
        Map lazy = LazyMap.decorate(new HashMap(), factory);
        System.out.println(lazy.get("NOW"));
        System.out.println(StringUtils.repeat("=", 40));
    }
}

以下是运行结果:

============= demoBidiMap ==============

Key-Value: BJ = Beijing

Value-Key: Chengdu = CD

========================================

============= demoMultiMap =============

Sean‘s skill set: [OO, Java, .NET]

========================================

============= demoLazyMap ==============

Wed Aug 03 12:44:56 CST 2005

========================================

4)Comparator:

Java代码

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public class Issue {
    private long id;
    private String severity;
    private String owner;

    public Issue() {}
    public Issue(long id, String severity, String owner) {
        this.id = id;
        this.severity = severity;
        this.owner = owner;
    }
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
                .append("id", id)
                .append("severity", severity)
                .append("owner", owner)
                .toString();
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getOwner() {
        return owner;
    }
    public void setOwner(String owner) {
        this.owner = owner;
    }
    public String getSeverity() {
        return severity;
    }
    public void setSeverity(String severity) {
        this.severity = severity;
    }
}

/** ComparatorUsage.java */
import java.util.Arrays;
import java.util.Comparator;

import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections.comparators.ComparatorChain;
import org.apache.commons.collections.comparators.FixedOrderComparator;
import org.apache.commons.lang.StringUtils;

public class ComparatorUsage {
    public static void main(String[] args) {
        demoComparator();
    }
    public static void demoComparator() {
        System.out.println(StringUtils.center(" demoComparator ", 40, "="));
        // data setup
        Issue[] issues = new Issue[] {
                new Issue(15102, "Major", "John"),
                new Issue(15103, "Minor", "Agnes"),
                new Issue(15104, "Critical", "Bill"),
                new Issue(15105, "Major", "John"),
                new Issue(15106, "Major", "John"),
                new Issue(15107, "Critical", "John"),
                new Issue(15108, "Major", "Agnes"),
                new Issue(15109, "Minor", "Julie"),
                new Issue(15110, "Major", "Mary"),
                new Issue(15111, "Enhancement", "Bill"),
                new Issue(15112, "Minor", "Julie"),
                new Issue(15113, "Major", "Julie")
        };
        // comparators setup
        String[] severityOrder = {"Critical", "Major", "Minor", "Enhancement"};
        Comparator severityComparator = new FixedOrderComparator(severityOrder);//key line1
        ComparatorChain compChain = new ComparatorChain();//key line2
        compChain.addComparator(new BeanComparator("owner"));
        compChain.addComparator(new BeanComparator("severity", severityComparator));
        compChain.addComparator(new BeanComparator("id"));
        // sort and display
        Arrays.sort(issues, compChain);//key line3
        for (int i = 0; i < issues.length; i++) {
            System.out.println(issues[i]);
        }
        System.out.println(StringUtils.repeat("=", 40));
    }
}

输出结果为:

============ demoComparator ============

Issue[id=15108,severity=Major,owner=Agnes]

Issue[id=15103,severity=Minor,owner=Agnes]

Issue[id=15104,severity=Critical,owner=Bill]

Issue[id=15111,severity=Enhancement,owner=Bill]

Issue[id=15107,severity=Critical,owner=John]

Issue[id=15102,severity=Major,owner=John]

Issue[id=15105,severity=Major,owner=John]

Issue[id=15106,severity=Major,owner=John]

Issue[id=15113,severity=Major,owner=Julie]

Issue[id=15109,severity=Minor,owner=Julie]

Issue[id=15112,severity=Minor,owner=Julie]

Issue[id=15110,severity=Major,owner=Mary]

========================================

5)Predicate:

Java代码

import org.apache.commons.collections.Predicate;
import org.apache.commons.collections.PredicateUtils;
import org.apache.commons.collections.functors.InstanceofPredicate;
import org.apache.commons.collections.functors.NotNullPredicate;
import org.apache.commons.lang.BooleanUtils;
import org.apache.commons.lang.StringUtils;

public class PredicateUsage {
    public static void main(String[] args) {
        demoPredicates();
    }
    public static void demoPredicates() {
        System.out.println(StringUtils.center(" demoPredicates ", 40, "="));
        Predicate p1 = new InstanceofPredicate(String.class); //key line1
        Predicate p2 = NotNullPredicate.getInstance(); //key line2
        Predicate p3 = new Predicate() { //key line3
            public boolean evaluate(Object obj) {
                String str = (String) obj;
                return StringUtils.isAlphanumeric(str)
                    && str.length() >= 6
                    && str.length() <= 10;
            }
        };
        Predicate p4 = PredicateUtils.allPredicate(new Predicate[]{p1, p2, p3}); //key line4
        String input = "ABCD1234";
        Object[] raw = new Object[] {
            "Is '",
            input,
            "' a valid input? ",
            BooleanUtils.toStringYesNo(p4.evaluate(input)),
            "."
        };
        System.out.println(StringUtils.join(raw));
        System.out.println(StringUtils.repeat("=", 40));
    }
}

输出结果如下:

============ demoPredicates ============

Is ‘ABCD1234‘ a valid input? yes.

========================================

6)Transformer:

Java代码

/** Applicant.java */
package sean.study.commons.collections;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;

public class Applicant {
    private String name;
    private int age;
    private String applyFor;

    public Applicant() {}
    public Applicant(String name, int age, String applyFor) {
        this.name = name;
        this.age = age;
        this.applyFor = applyFor;
    }
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
                .append("name", name)
                .append("age", age)
                .append("applyFor", applyFor)
                .toString();
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getApplyFor() {
        return applyFor;
    }
    public void setApplyFor(String applyFor) {
        this.applyFor = applyFor;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

/** Employee.java */
import java.util.Date;

import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.commons.lang.time.DateFormatUtils;

public class Employee {
    private String name;
    private int age;
    private Date dateJoined;
    private String grade;
    private double salary;

    public Employee() {}
    public Employee(String name, int age, Date dateJoined, String grade, double salary) {
        this.name = name;
        this.age = age;
        this.dateJoined = dateJoined;
        this.grade = grade;
        this.salary = salary;
    }
    public String toString() {
        return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE)
                .append("name", name)
                .append("age", age)
                .append("dateJoined", DateFormatUtils.format(dateJoined, "yyyy-MM-dd"))
                .append("grade", grade)
                .append("salary", salary)
                .toString();
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public Date getDateJoined() {
        return dateJoined;
    }
    public void setDateJoined(Date dateJoined) {
        this.dateJoined = dateJoined;
    }
    public String getGrade() {
        return grade;
    }
    public void setGrade(String grade) {
        this.grade = grade;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public double getSalary() {
        return salary;
    }
    public void setSalary(double salary) {
        this.salary = salary;
    }
}

/** TransformerUsage.java */
import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.Predicate;
import org.apache.commons.collections.Transformer;
import org.apache.commons.collections.functors.SwitchTransformer;
import org.apache.commons.lang.StringUtils;

public class TransformerUsage {
    public static void main(String[] args) {
        demoTransformerUsage();
    }
    public static void demoTransformerUsage() {
        System.out.println(StringUtils.center(" demoTransformerUsage ", 40, "="));

        // data setup
        Applicant[] applicants = new Applicant[] {
            new Applicant("Tony", 26, "Developer"),
            new Applicant("Michelle", 24, "Tester"),
            new Applicant("Jack", 28, "Project Manager")
        };
        List appList = Arrays.asList(applicants);

        // predicate setup
        Predicate isDeveloper = new Predicate() {
            public boolean evaluate(Object obj) {
                Applicant app = (Applicant) obj;
                return "Developer".equalsIgnoreCase(app.getApplyFor());
            }
        };
        Predicate isTester = new Predicate() {
            public boolean evaluate(Object obj) {
                Applicant app = (Applicant) obj;
                return "Tester".equalsIgnoreCase(app.getApplyFor());
            }
        };
        Predicate isPM = new Predicate() {
            public boolean evaluate(Object obj) {
                Applicant app = (Applicant) obj;
                return "Project Manager".equalsIgnoreCase(app.getApplyFor());
            }
        };
        Predicate[] checkApplyFor = new Predicate[] {
            isDeveloper,
            isTester,
            isPM
        };

        // transformer setup
        Transformer developerTransformer = new Transformer() {
            public Object transform(Object obj) {
                Applicant app = (Applicant) obj;
                return new Employee(
                    app.getName(), app.getAge(), new Date(), "E4", 2000
                );
            }
        };
        Transformer testerTransformer = new Transformer() {
            public Object transform(Object obj) {
                Applicant app = (Applicant) obj;
                return new Employee(
                    app.getName(), app.getAge(), new Date(), "E4", 2000
                );
            }
        };
        Transformer pmTransformer = new Transformer() {
            public Object transform(Object obj) {
                Applicant app = (Applicant) obj;
                return new Employee(
                    app.getName(), app.getAge(), new Date(), "E5", 3000
                );
            }
        };
        Transformer[] transformers = new Transformer[] {
            developerTransformer,
            testerTransformer,
            pmTransformer
        };

        // transform
        Transformer employTransformer = new SwitchTransformer(
            checkApplyFor, transformers, null
        );
        Collection employed = CollectionUtils.collect(appList, employTransformer);

        // output
        System.out.println("Applicants: ");
        Iterator iter1 = appList.iterator();
        while (iter1.hasNext()) {
            System.out.println(iter1.next());
        }
        System.out.println("Employed: ");
        Iterator iter2 = employed.iterator();
        while (iter2.hasNext()) {
            System.out.println(iter2.next());
        }

        System.out.println(StringUtils.repeat("=", 40));
    }

}

以下是运行结果:

========= demoTransformerUsage =========

Applicants:

Applicant[name=Tony,age=26,applyFor=Developer]

Applicant[name=Michelle,age=24,applyFor=Tester]

Applicant[name=Jack,age=28,applyFor=Project Manager]

Employed:

Employee[name=Tony,age=26,dateJoined=2005-08-05,grade=E4,salary=2000.0]

Employee[name=Michelle,age=24,dateJoined=2005-08-05,grade=E4,salary=2000.0]

Employee[name=Jack,age=28,dateJoined=2005-08-05,grade=E5,salary=3000.0]

========================================

7)Closure:

Java代码

import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;

import org.apache.commons.collections.Closure;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;

public class ClosureUsage {

    public static void main(String[] args) {
        demoClosureUsage();
    }

    public static void demoClosureUsage() {

        System.out.println(StringUtils.center(" demoClosureUsage ", 40, "="));

        // data setup
        Employee[] employees = new Employee[] {
            new Employee("Tony", 26, new Date(), "E4", 2000),
            new Employee("Michelle", 24, new Date(), "E4", 2000),
            new Employee("Jack", 28, new Date(), "E5", 3000)
        };
        Collection empColl = Arrays.asList(employees);
        printColl("Before salary increase:", empColl);

        // closure setup
        Closure salaryIncreaseClosure = new Closure() {//key line1
            public void execute(Object obj) {
                Employee emp = (Employee) obj;
                emp.setSalary(emp.getSalary() * 1.20);
            }
        };

        // salary increase
        CollectionUtils.forAllDo(empColl, salaryIncreaseClosure);//key line2
        printColl("After salary increase:", empColl);

        System.out.println(StringUtils.repeat("=", 40));
    }

    public static void printColl(String label, Collection c) {
        if (StringUtils.isNotBlank(label)) {
            System.out.println(label);
        }
        Iterator iter = c.iterator();
        while (iter.hasNext()) {
            System.out.println(iter.next());
        }
    }
}

以下是运行结果:

=========== demoClosureUsage ===========

Before salary increase:

Employee[name=Tony,age=26,dateJoined=2005-08-05,grade=E4,salary=2000.0]

Employee[name=Michelle,age=24,dateJoined=2005-08-05,grade=E4,salary=2000.0]

Employee[name=Jack,age=28,dateJoined=2005-08-05,grade=E5,salary=3000.0]

After salary increase:

Employee[name=Tony,age=26,dateJoined=2005-08-05,grade=E4,salary=2400.0]

Employee[name=Michelle,age=24,dateJoined=2005-08-05,grade=E4,salary=2400.0]

Employee[name=Jack,age=28,dateJoined=2005-08-05,grade=E5,salary=3600.0]

========================================

8)Iterator:

Java代码

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

import org.apache.commons.collections.Predicate;
import org.apache.commons.collections.iterators.ArrayListIterator;
import org.apache.commons.collections.iterators.FilterIterator;
import org.apache.commons.collections.iterators.LoopingIterator;
import org.apache.commons.lang.StringUtils;

public class IteratorUsage {

    public static void main(String[] args) {
        demoIteratorUsage();
    }

    public static void demoIteratorUsage() {

        System.out.println(StringUtils.center(" demoClosureUsage ", 40, "="));

        // data setup
        String[] weekDays = {
            "Monday", "Tuesday", "Wednesday",
            "Thursday", "Friday", "Saturday", "Sunday"
        };
        List weekDayList = Arrays.asList(weekDays);

        // workdays
        Iterator iter1 = new ArrayListIterator(weekDays, 0, 5);//key line1
        printColl("Partial:", iter1, 5);

        // loop
        Iterator iter2 = new LoopingIterator(weekDayList);//key line2
        printColl("Loop:", iter2, 10);

        // looping workdays
        Predicate notWeekendPredicate = new Predicate() {
            public boolean evaluate(Object obj) {
                String str = (String) obj;
                if ("Saturday".equalsIgnoreCase(str)) {
                    return false;
                }
                if ("Sunday".equalsIgnoreCase(str)) {
                    return false;
                }
                return true;
            }
        };
        Iterator iter3 = new FilterIterator(//key line3
            new LoopingIterator(weekDayList),
            notWeekendPredicate
        );
        printColl("No Weekends loop:", iter3, 12);

        System.out.println(StringUtils.repeat("=", 40));

    }

    public static void printColl(String label, Iterator iter, int maxCount) {
        if (StringUtils.isNotBlank(label)) {
            System.out.println(label);
        }
        int i = 0;
        while (iter.hasNext() && i < maxCount) {
            System.out.println("# " + iter.next() + " #");
            i++;
        }
    }

}

运行结果如下:

=========== demoClosureUsage ===========

Partial:

# Monday #

# Tuesday #

# Wednesday #

# Thursday #

# Friday #

Loop:

# Monday #

# Tuesday #

# Wednesday #

# Thursday #

# Friday #

# Saturday #

# Sunday #

# Monday #

# Tuesday #

# Wednesday #

No Weekends loop:

# Monday #

# Tuesday #

# Wednesday #

# Thursday #

# Friday #

# Monday #

# Tuesday #

# Wednesday #

# Thursday #

# Friday #

# Monday #

# Tuesday #

========================================

时间: 2024-11-08 18:11:28

Commons-Collections简介的相关文章

关于java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap的错误解决办法

在JavaEE开发中,在把配置文件中的数据或用户表单提交上来的数据,封装在相应JavaBean的对象的对应属性中时:在实际开发中,使用第三方法工具包BeanUtils(commons-beanutils-xxx.jar 依赖于commons-logging-xx.jar). 如博主在JavaWeb工程中,导入的jar包:commons-beanutils-1.9.3.jar和commons-logging-1.2.jar 这是在运行时报错了:eption in thread "main"

apche commons项目简介

1.apche commons项目封装了日常开发中经常使用的功能,如io, String等. http://commons.apache.org/ Apache Commons项目的由三部分组成: The Commons Proper - 一个可重用的Java组件库.(已经发布过的) The Commons Sandbox - Java组件开发工作区. (正在开发的项目) The Commons Dormant - 当前处于非活动状态的组件库.(刚启动或者已经停止维护的项目) 建立和维护可重用的

apache.commons.collections.map.ListOrderedMap

报这个异常: java.lang.ClassNotFoundException: org.apache.commons.collections.map.ListOrderedMap 解决方法:commons-collections-3.2.jar没有或版本不对.比如commons-collections-4即报此异常

Apache Commons Collections

http://commons.apache.org/proper/commons-collections/userguide.html 1. Utilities SetUtils CollectionUtils MapUtils 2.Maps Map Iteration Ordered Maps Bidirectional Maps 3.Bags Apache Commons Collections

apache commons collections CollectionUtils工具类简单使用

CollectionUtils提供很多对集合的操作方法,常用的方法如下 import org.apache.commons.collections.CollectionUtils; import java.util.ArrayList; import java.util.List; public class CollectionUtilsTest {      public static void main(String[] args) {         List<Integer> a = 

出现java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap错误问题解决

首先出现这个问题,你应该是用了 BeanUtils.populate(meter,map); import org.apache.commons.beanutils.BeanUtils;并且导入了commons-beanutils-1.9.2.jar , commons-logging-1.2.jar这俩包如果是那么我可能就能解决你的问题.java.lang.NoClassDefFoundError: org/apache/commons/collections/FastHashMap在java

ysoserial分析【一】 之 Apache Commons Collections

目录 0x00 前言 0x01 基础知识 Transformer 利用InvokerTransformer造成命令执行 Map TransformedMap LazyMap AnnotationInvocationHandler 动态代理 0x02 Commons Collections Gadget 分析 CommonsCollections1 CommonsCollections2 疑问 CommonsCollections3 CommonsCollections4 CommonsColle

Apache Commons Collections基本操作(Predicate、Transformat、Closure等)

一.Predicate断言 package Collections; import java.util.ArrayList; import java.util.List; import org.apache.commons.collections4.Predicate; import org.apache.commons.collections4.PredicateUtils; import org.apache.commons.collections4.functors.EqualPredic

Apache Commons IO简介

虽然Google的guava对Java的IO操作进行了一定封装,但是它更偏向于集合.并发和缓存,在实际项目中,我非常喜欢guava,同时我也非常喜欢Apache的一个工具包org.apache.commons.io,这两个工具包提供非常强大的工具能力,能够简化代码逻辑,提高开发效率和质量,是每个Java程序员都应该掌握的工具包.此文简单介绍一下org.apache.commons.io,详细的可参考其API注,此文绝大部分内容翻译自http://www.javacodegeeks.com/201

Apache Commons CLI 简介

CLI 命令代码实现 命令行程序处理流程相对比较简单,主要流程为设定命令行参数 -> 解析输入参数 -> 使用输入的数据进行逻辑处理CLI 定义阶段 每一条命令行都必须定义一组参数,它们被用来定义应用程序的接口.Apache Commons CLI 使用 Options 这个类来定义和设置参数,它是所有 Option 实例的容器.在 CLI 中,目前有两种方式来创建 Options,一种是通过构造函数,这是最普通也是最为大家所熟知的一种方式:另外一种方法是通过 Options 中定义的工厂方式