如何使用Java 8 Streams从对象列表中提取字符串值并创建新列表?

时间:2018-01-12 16:46:49

标签: java lambda

在看了各种各样的例子后,我似乎无法想出这个。

这就是我现在正在做的事情:

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());

但不幸的是,这不会编译。

2 个答案:

答案 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()));

语法略有不同,因为lastPagelastPageAgain实际上是不同的类型。