使用Java流的此循环的Aggregate / Reduce版本是什么?

时间:2014-04-23 16:07:41

标签: java java-8

我正在尝试加速Streams API,但我真的习惯了C#Linq扩展函数的简单性以及使用yield关键字创建迭代器的能力。通常我会使用:

list.Aggregate(set, (acc, a) => { acc.add(a.Id); return acc});

或类似的东西,但我没有立即看到它如何映射到Streams API。

List<SomeObject> objs = ...

Set<String> ids = new HashSet<>();

for (SomeObject a : objs) {
   ids.add(a.getId());
}

assertThat(ids.size(), objs.size());

修改 在for循环中将SomeObject.getId()更改为a.getId()。

1 个答案:

答案 0 :(得分:2)

以下语句应与示例中的for循环等效。

Set<String> ids = objs.stream()
                      .map(a -> a.getId())
                      .collect(Collectors.toSet());

您还可以使用方法引用而不是 lambda表达式

Set<String> ids = objs.stream()
                      .map(SomeObject::getId)
                      .collect(Collectors.toSet());