與Java 8,你可以這樣做:
List<String> strings = Arrays.asList("1","2","3") ;
List<Integer> numbers = strings.stream()
.map(Integer::parseInt)
.map((i) -> i * 2)
.collect(Collectors.toList()) ;
使用Java 7,一種方法是這樣的:
首先,定義一個接口,從一種類型轉變爲另一種:
static interface Mapper<T,U> {
U apply(T value) ;
}
然後,我們可以定義一個委託給迭代器的類,並在返回的每個元素上應用Mapper.apply
方法:
static class Collector<T,U> implements Iterator<U> {
Iterator<T> delegate ;
Mapper<T,U> mapper ;
public Collector(Iterable<T> elements, Mapper<T,U> c) {
delegate = elements.iterator() ;
this.mapper = c ;
}
@Override
public void remove() { delegate.remove() ; }
@Override
public boolean hasNext() { return delegate.hasNext() ; }
@Override
public U next() { return mapper.apply(delegate.next()) ; }
}
然後,我們可以調用它,使用類似:
List<String> strings = Arrays.asList("1","2","3") ;
// Create our mapping Iterator
Iterator<Integer> iter = new Collector<>(strings, new Mapper<String,Integer>() {
@Override
public Integer apply(String v) {
return Integer.parseInt(v) * 2 ;
}
}) ;
// Collect back from iterator into a List
List<Integer> numbers = new ArrayList<>() ;
while(iter.hasNext()) {
numbers.add(iter.next()) ;
}
的Java 8和Groovy FTW ;-)
的Java 8?或者你想要一個Java 7版本? –
Java 7.謝謝。 – pinker
在Java 7中增加了一種工作方式;-)雖然可能有更漂亮的解決方案;-) –