我正在看一些使用Guava迭代嵌入式循环以分析在这种情况下更合适的示例。
我们的环境使用Java 6,我们需要使用Apache POI创建一个Excel解析器。
找到了带有两个嵌入式for循环的示例:
FileInputStream file = new FileInputStream(new File("C:\\test.xls"));
//Get the workbook instance for XLS file
HSSFWorkbook workbook = new HSSFWorkbook(file);
//Get first sheet from the workbook
HSSFSheet sheet = workbook.getSheetAt(0);
//Iterate through each rows from first sheet
for (Row row : sheet) {
//For each row, iterate through each columns
for (Cell cell : row) {
switch(cell.getCellType()) {
case Cell.CELL_TYPE_BOOLEAN:
System.out.print(cell.getBooleanCellValue() + "\t\t");
break;
case Cell.CELL_TYPE_NUMERIC:
System.out.print(cell.getNumericCellValue() + "\t\t");
break;
case Cell.CELL_TYPE_STRING:
System.out.print(cell.getStringCellValue() + "\t\t");
break;
}
}
System.out.println("");
}
file.close();
FileOutputStream out = new FileOutputStream(new File("C:\\test.xls"));
workbook.write(out);
out.close();
我想问你,使用while / for循环或番石榴过滤器迭代的最佳方法是什么?顺便说一句,还发现番石榴FluentIterable可能合适,但我对功能方法不太熟悉。
你能帮我个忙吗?提前致谢
最佳答案
如果您真的想使用功能性方法来解决此问题,则可以为Iterator
实现函子,并映射一个在rowIterator
上格式化单元格类型的函数。
一元功能界面:
public interface Fn1<A,B> {
B apply(A a);
}
Iterator
的函子:public class IteratorFunctor<A> {
public final Iterator<A> i;
private IteratorFunctor(Iterator<A> _i) {
i = _i;
}
public <B> IteratorFunctor<B> map(Fn1<A,B> f) {
List<B> bs = new LinkedList<B>();
while (i.hasNext()) {
bs.add(f.apply(i.next()));
}
return apply(bs.iterator());
}
public static <A> IteratorFunctor<A> apply(Iterator<A> _i) {
return new IteratorFunctor<A>(_i);
}
}
格式函数(对您来说,这需要一个
Cell
并可能返回一个String
):public static String format(int x) {
switch (x) {
case 1:
return "one";
case 2:
return "two";
default:
return "big";
}
}
演示:
Fn1<Integer,String> formatFn = new Fn1<Integer,String>() {
public String apply(Integer x) {
return format(x);
}
};
List<Integer> xs = Arrays.asList(1,2,3,4);
IteratorFunctor<Integer> fi = IteratorFunctor.apply(xs.iterator());
IteratorFunctor<String> fs = fi.map(formatFn);
Iterator<String> ss = fs.i;
int i = 0;
while (ss.hasNext()) {
System.out.println(i + ": " + ss.next());
i = i + 1;
}
// Prints the following to stdout:
//
// 0: one
// 1: two
// 2: big
// 3: big
//