有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Groovy中的闭包在等效Java中实现

我有以下Groovy脚本:

def n = ["1","2","3"]
println n.collect { v -> v.toInteger()*2 }

我想把它翻译成等价的Java代码(从“collect”的含义中抽象出来——现在不管它做什么)

我写了以下内容:

class X {
   X() {
          object[] n = new object[]{"1","2","3"};

          object anonymousBlock(object v) { return v.toInteger()*2; }

          System.out.println(n.collect(???));
   }
}

使用上面的表示,我应该传递什么作为参数来收集


共 (1) 个答案

  1. # 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;-)