我有以下Groovy脚本:
def n = ["1","2","3"]
println n.collect { v -> v.toInteger()*2 }
我想将它转换为等效的Java代码(从“收集”的含义中抽象出来 - 无论它现在做什么都无关紧要)。
我写了以下内容:
class X {
X() {
object[] n = new object[]{"1","2","3"};
object anonymousBlock(object v) { return v.toInteger()*2; }
System.out.println(n.collect(???));
}
}
我应该使用上述表示作为参数传递什么?
答案 0 :(得分:3)
使用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; - )