我试图使用.map和流函数创建一个HashSet。

s是具有"id"参数的对象,Long类型。

这是我失败的尝试:

     HashSet<Long> output = s.stream()
                             .map(v -> v.getId())
                             .collect(Collectors.toSet());
分析解答

在您的情况下,流的结果将是Set<Long>,并且您希望将其分配给HashSet类型的变量。由于HashSetSet的子类型,因此无法执行此操作。您可以将输出变量的类型更改为Set<Long>,或者将收集结果显式转换为HashSet<Long>。由于Collectors::toSet默认使用HashMap - 它应该可以工作。

编辑

正如shmosel正确指出的那样,如果你想让HashSet专门使用toCollection(HashSet::new),那么对返回类型做出假设可能是个坏主意:

HashSet<Long> output = s.stream()
                .map(v -> v.getId())
                .collect(Collectors.toCollection(HashSet::new));

现在,collect操作的结果将是HashSet<Long>,因此您可以将其分配给HashSet<Long>Set<Long>变量。