Mic*_*ael 6 java file-io iterator iterable
假设我有一个类Point和一个处理Point实例的函数
class Point { private final int x, y; ... }
...
void handlePoints(Iterable<Point> points) { for (Point p: points) {...} }
现在我想points从一个文件中读取.该文件的每一行包含两个数字,因此我有一个函数("工厂方法")来创建point一个行.
Point makePoint(String line) { ... }
我现在应该怎么做?我可以编写一个函数来读取文件列表points并调用该handlePoints函数.
List<Point> readPoints(BufferedReader reader) {...} // use makePoint here
void handlePoints(BufferedReader reader) {
List<Point> points = readPoints(reader);
handlePoints(points);
}
不幸的是,这个功能似乎并不特别优雅,因为它在内存中创建了一个不必要的点列表.
使用迭代器不是更好吗?
void handlePoints(Iterator<Point> points) {...}
Iterator<Point> readPoints(BufferedReader reader) {...} // use makePoint here
void handlePoints(BufferedReader reader) {
Iterator<Point> points = readPoints(reader);
handlePoints(points);
}
是否有意义?这个代码在Java中不会太"吵"吗?
如果你不需要记忆中的所有点,那么请考虑以下几点:
while (reader.ready())
{
String line = reader.readLine();
Point point = makePoint(line);
handlePoint(point);
}
Run Code Online (Sandbox Code Playgroud)
如何使用迭代器和handlePoints执行此操作:(用于处理要添加的异常的代码)
class PointIterator implements Iterator<Point>
{
BufferedReader reader;
PointIterator(BufferedReader myReader) { reader = myReader; };
@Override
public boolean hasNext() { return myReader.ready(); };
@Override
public Point next() { return makePoint(myReader.readLine()); };
@Override
public void remove()
{ throw new UnsupportedOperationException("Remove not supported!"); };
}
Run Code Online (Sandbox Code Playgroud)
因为handlePoints需要Iterable:
class PointIterable implements Iterable<Point>
{
BufferedReader reader;
public PointIterable(BufferedReader myReader) { reader = myReader; };
@Override
public Iterator<Point> iterator() { return new PointIterator(reader); }
}
Run Code Online (Sandbox Code Playgroud)
使用:
handlePoints(new PointIterable(reader));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8346 次 |
| 最近记录: |