Java8的.map()流操作的Groovy替代方案

11
Groovy有没有类似于Java 8的.map()的替代方法?
示例:
List<String> codes = events
    .stream()
    .map(event -> event.getCode())
    .collect(Collectors.toList());

我试图去做

events.each { it; return it.getCode() }.collect() as String[]

但我得到的是一个List字符串列表,而不是代码的toString()表示。


8
events.collect { it.code }events*.code 是一种语法糖,用于收集 events 中每个对象的 code 属性。 - dmahapatro
只有事件。*{it.code} - Andriy Slobodyanyk
each 更适合于副作用(它返回进入的列表(不可能返回或中断))。 - cfrick
你的代码有几个问题:你使用了each,它是用来对每个元素执行某些操作的,但没有从中产生任何值;事件被传递到下一个方法collect时仍然保持原样,在闭包中没有做任何事情:在Groovy中,collect与Java中的map相同,但你需要一个条件来决定要收集什么:it.code(在Java中映射到什么)。之后就不需要任何类似于Java collect的东西将流转换为列表,因为在Groovy中你已经有一个列表了。 - user1708042
1个回答

32

请考虑如下所示的collect方法:

class Event {
    def code
    def name
}

def events = []
events << new Event(code: '001', name: 'a')
events << new Event(code: '002', name: 'b')

def codes = events.collect { it.code }

assert ['001','002'] == codes
注意,一个等效的Groovy习惯用法是使用spread-dot操作符
def codes = events*.code

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接