论坛首页 入门技术论坛

小技巧:通过Iterable实现 for(String str : reader)

浏览 3507 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-11-26  

在python中读取文件可以很简单的使用

 

for line in myfile.readlines():
    print line

 

 

而在jdk1.5中,只要我们的类实现了Iterable接口的,即也可以使用如下语句, for(Object o : iterable);

Iterable的接口声明如下.

 

public interface Iterable<T> {

    /**
     * Returns an iterator over a set of elements of type T.
     * 
     * @return an Iterator.
     */
    Iterator<T> iterator();
}

 

 也即返回一个迭代器Iterator接口即可. 所以我们现在来改造我们的Reader,实现如下:

 

public class IterableReader extends BufferedReader implements Iterable<String>{

	public IterableReader(Reader in) {
		super(in);
	}

	public Iterator<String> iterator() {
		return new IteratorReader();
	}
	
	class IteratorReader implements Iterator{
		String line = null;
		public boolean hasNext() {
			try {
				line = readLine();
			} catch (IOException e) {
				return false;
			}
			if(line == null) {
				return false;
			}
			return true;
		}

		public Object next() {
			return line;
		}

		public void remove() {
			throw new UnsupportedOperationException();
		}
	}
}

 

 

现在我们的reader即可如下使用

 

StringReader r = new StringReader(" 111 \n 222 \n 333");
IterableReader reader = new IterableReader(r);
for(String str : reader) {
	System.out.println(str);
}

 

 是否感觉简洁了许多呢? :)

 

 

 

 


   发表时间:2009-11-27  
用 java.util.Scanner ...
0 请登录后投票
   发表时间:2009-11-27  
Scanner不行吧,要注意Iterator与Iterable接口之间的区别
0 请登录后投票
   发表时间:2009-11-27  
badqiu 写道
Scanner不行吧,要注意Iterator与Iterable接口之间的区别


囧,把Scanner包装一下不就OK了吗?
用的着自己去重造这个轮子嘛
0 请登录后投票
   发表时间:2009-11-27  
一:并不是所有人都知道有Scanner这个类,比如我
二:这里没有轮子,只是演示for(String str : reader),难道你认为跟Scanner一样。
0 请登录后投票
   发表时间:2009-11-27  
其实scanner 和楼主的意思差不多
0 请登录后投票
   发表时间:2009-11-29  
流不用关闭了?
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics