2014-02-10 41 views
1

我有以下Groovy脚本:闭包在Groovy - 等效实现的Java

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

的Java 8?或者你想要一个Java 7版本? –

+0

Java 7.谢谢。 – pinker

+0

在Java 7中增加了一种工作方式;-)虽然可能有更漂亮的解决方案;-) –

回答

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 ;-)