2014-02-10 45 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 ;-)