在看了各种各样的例子后,我似乎无法想出这个。
这就是我现在正在做的事情:
HashSet<String> oldIds = new HashSet<>();
HashSet<String> newIds = new HashSet<>();
for (Release currentRelease: lastPage.getPage()) {
oldIds.add(currentRelease.getId());
}
for (Release currentRelease: lastPageAgain) {
newIds.add(currentRelease.getId());
}
我知道有更好的方法可以将这些值“收集”到HashSet中:
lastPage.getPage().getContent().stream().collect(release::getId());
但不幸的是,这不会编译。
答案 0 :(得分:2)
您有多种语法错误。
1)此处release
不是变量
您必须在方法参考中引用Release
类。
2)方法引用不必像在此处一样指定方法的括号:release::getId()
方法参考总是指方法
所以()
确实是隐含的
此外,方法参考可以指具有参数的方法
因此,指定()
也会非常容易出错。
只需将release::getId()
替换为release::getId
。
3)collect()
无法接受release::getId()
等功能
在其最简单的重载形式中,它期望具有Collector
。所以传递Collectors.toSet()
作为参数。
您只需使用map()
将某些内容映射到其他内容即可
请注意,您应该在代码中使用Set<String>
到HashSet<String>
。
通过接口编程可以提高代码的可维护性
Collectors.toSet()
遵循这一原则。因此它返回Set<String>
声明的类型。
Set<String> oldIds = lastPage.getPage().getContent()
.stream()
.map(Release::getId).collect(Collectors.toSet());
为newIds
做同样的事情。
答案 1 :(得分:0)
这对我有用:
HashSet<String> oldIds = new HashSet<>();
HashSet<String> newIds = new HashSet<>();
lastPage.getPage().getContent().forEach(r -> oldIds.add(r.getId())); // my first lambda :)
lastPageAgain.forEach(r -> newIds.add(r.getId()));
语法略有不同,因为lastPage
和lastPageAgain
实际上是不同的类型。