`
rensanning
  • 浏览: 3509846 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:37407
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:603972
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:677512
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:86989
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:399568
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:68983
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:90294
社区版块
存档分类
最新评论

Java增强for循环中获取index

    博客分类:
  • Java
 
阅读更多
前提测试数据:
String[] data = new String[]{"rensanning001", "rensanning002", "rensanning003"};
List<String> dataList = Arrays.asList(data);


普通的For循环:
for (int i = 0; i < dataList.size(); i++) {
  System.out.println(i + ":" + dataList.get(i));
}


增强For循环(获取index需要定义额外的变量):
int i = 0;
for (String elem : dataList) {
  System.out.println(i + ":" + elem);
  i++;
}


自定义静态方法实现带index的循环:
for (Indexer<String> elem : ExtFor1.loop(dataList)) {
  System.out.println(elem.index() + ":" + elem.value());
}

public class ExtFor1 {
	
	public static <T> Iterable<Indexer<T>> loop(final Iterable<T> list) {
		return new Iterable<Indexer<T>>() {
			@Override
			public Iterator<Indexer<T>> iterator() {
				return new Iterator<Indexer<T>>() {
					private int counter = 0;
					private Iterator<T> iterator = list.iterator();

					@Override
					public boolean hasNext() {
						return iterator.hasNext();
					}

					@Override
					public Indexer<T> next() {
						Indexer<T> elem = new Indexer<T>(counter++, iterator.next());
						return elem;
					}

					@Override
					public void remove() {
						throw new RuntimeException();
					}
				};
			}
		};
	}

}


扩展Iterable实现带index的循环:
for (Indexer<String> elem : ExtFor2.loop(dataList)) {
  System.out.println(elem.index() + ":" + elem.value());
}

public class ExtFor2<T> implements Iterable<Indexer<T>> {
    private Iterator<T> iterator;

    private ExtFor2(Iterable<T> iter) {
        this.iterator = iter.iterator();
    }

    public static <T> ExtFor2<T> loop(Iterable<T> iter) {
        return new ExtFor2<T>(iter);
    }

    @Override
    public Iterator<Indexer<T>> iterator() {
		return new Iterator<Indexer<T>>() {
			private int counter = 0;

			@Override
			public boolean hasNext() {
				return iterator.hasNext();
			}

			@Override
			public Indexer<T> next() {
				Indexer<T> elem = new Indexer<T>(counter++, iterator.next());
				return elem;
			}

			@Override
			public void remove() {
				throw new RuntimeException();
			}
		};
	}

}


jquery风格的for循环:
For.each(dataList, new For.Function<String>() {
  public void execute(int index, String elem) {
    System.out.println(index + ":" + elem);
  }
});

public class For {
	
	public static <T> void each(List<T> list, Function<T> function) {
		int length = list.size();
		for (int index = 0; index < length; index++) {
			function.execute(index, list.get(index)); 
		}
	}

	public static interface Function<T> {
		public void execute(int index, T obj);
	}
}


public class Indexer<T> {
	private final int index;
	private final T value;

	public Indexer(int index, T value) {
		this.index = index;
		this.value = value;
	}

	public int index() {
		return this.index;
	}

	public T value() {
		return this.value;
	}
}


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics