与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中增加了一种工作方式;-)虽然可能有更漂亮的解决方案;-) –