DataList.java

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

[java]</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>
[/java]

共有 0 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注