java收集集合字段的所有值
我有一个集合,它有一个类型为Set的字段,其中包含一些值。我需要创建一个收集所有这些值的新集合
我想知道这是否可以使用lambda表达式
下面是代码行:
Set<String> teacherId = batches.stream()
.filter(b -> !CollectionUtils.isEmpty(b.getTeacherIds()))
.map(b -> b.getTeacherIds())
.collect(Collectors.toSet());
问题是post映射操作,它包含一组字符串。所以collect操作返回一个Set<Set<String>>
,但我希望将所有值聚合到一个集合中
# 1 楼答案
您可以使用
flatMap
获取所有值的平面Stream
,然后收集到Set<String>
:# 2 楼答案
如果您关心
getTeacherIds()
不是空的,请通过!=
显式使用它,因为CollectionUtils.isEmpty
只是隐藏内容。特别是因为如果getTeacherIds()
返回一个空集合,那么flatMap
就可以很好地处理它,所以对我来说,这根本不需要# 3 楼答案
我抓到了最后一条鱼,:)
注意:很抱歉,我忘了告诉您,如果
getTeacherIds
将内部ID复制到一组新的ID,上面的代码适合您。因为它从XClass
读取ID一次# 4 楼答案
您需要使用^{} 而不是
map
:请注意,过滤对于空集合是多余的——流式传输空集合只会导致空流,这不会影响最终结果。 但是,如果
getTeacherIds()
可以返回null
,您仍然需要处理它。使用filter(Objects::nonNull)
就足够了,并且可以避免对Apache Commons的依赖