【问题标题】:Closures in Groovy - Implementing in equivalent JavaGroovy 中的闭包 - 用等效的 Java 实现
【发布时间】:2014-02-10 17:24:34
【问题描述】:

我有以下 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(???));
   }
}

我应该将什么作为参数传递给使用上述表示的收集?

【问题讨论】:

  • Java 8?还是您想要 Java 7 版本?
  • 在 Java 7 中添加了一个可行的方法 ;-) 不过可能有更漂亮的解决方案 ;-)

标签: java groovy closures


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-09-05
    • 1970-01-01
    • 2011-03-17
    • 2013-08-05
    • 2013-09-21
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    相关资源
    最近更新 更多