DataList.java

和同学讨论传递Function是否可以解耦写的代码,QQ讨论时没语法高亮就放博客了,一直忘删了。

</pre>
<pre>package datalist2;

import java.util.ArrayList;
import java.util.function.Function;

/**
 * 数据列表,有三列
 * @param <X>
 * @param <Y>
 * @param <Z>
 */
public class DataList<X,Y,Z> {
    private ArrayList<ThreeD<X,Y,Z>>list=new ArrayList<>();

    /**
     * 增加一行
     * @param threeD
     */
    public void add(ThreeD<X,Y,Z> threeD){
        list.add(threeD);
    }


    /**
     * 三列迭代器实现的可复用代码
     * @param <E>
     */
    private abstract class Iter<E> implements Iterator<E> {
        int i=-1;
        public abstract E next();
        public boolean hasNext() {
            return i<list.size()-1;
        }
    }

    public <E> Iterator getIterator(Function<ThreeD,E> columnGetter){
        Iter iter=new Iter<E>(){
            @Override
            public E next() {
                i++;
                return columnGetter.apply(list.get(i));
            }
        };
        return iter;
    }

    public static void main(String[] args) {
        //GDP排名列表
        DataList<Integer,String,Double> GDPRank=new DataList<Integer,String,Double>();
        GDPRank.add(new ThreeD<>(1,"美国",9710.25));
        GDPRank.add(new ThreeD<>(2,"日本",8000.00));
        GDPRank.add(new ThreeD<>(3,"中国",3150.90));

        //列出表中所有国家名
        Iterator iterator=GDPRank.getIterator(ThreeD::getY);
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
        /**
         *
         * Output:
         美国
         日本
         中国
         */
    }

}

/**
 * 三维元组
 * @param <X>
 * @param <Y>
 * @param <Z>
 */
class ThreeD<X,Y,Z> {
    private final X x;
    private final Y y;
    private final Z z;
    public ThreeD(X x,Y y,Z z){
        this.x=x;
        this.y=y;
        this.z=z;
    }

    public X getX() {
        return x;
    }

    public Y getY() {
        return y;
    }

    public Z getZ() {
        return z;
    }
}

/**
 * 通用迭代器
 * @param <E>
 */
interface Iterator<E> {
    E next();
    boolean hasNext();
}


</pre>
<pre>

共有 0 条评论

发表评论

电子邮件地址不会被公开。