v.toInteger()*2 } 我想将它翻译成等效的 Java 代码(-6ren">
gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 03:24:38 32 4
gpt4 key购买 nike

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

使用上面的表示,我应该将什么作为参数传递给 collect?

最佳答案

使用 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,一种方法是这样的:

首先,定义一个从一种类型转换为另一种类型的接口(interface):

static interface Mapper<T,U> {
U apply( T value ) ;
}

然后,我们可以定义一个委托(delegate)给迭代器的类,并在每个返回的元素上应用 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 ;-)

关于java - Groovy 中的闭包 - 在等效的 Java 中实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21683872/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com