首页 > 解决方案 > Java Stream - 结合过滤和收集

问题描述

ColumnFamily column = tokens.getColumnFamilies().stream()
    .filter(family -> family.getName().equals("this_family"))
    .findAny()
    .get();

Map<String, String> tokenized = column.getColumns().stream()
    .collect(Collectors.toMap(
        Column::getQualifier,
        Column::getValue
    ));

有没有办法可以将这两个流合并为一个?我正在使用第一个流在我的嵌套列表中进行过滤和查找,并使用第二个流根据流的结果创建地图。我想知道是否有一种方法可以使用单个流来完成此操作。

像这样的东西

Map<String, String> tokenized = tokens.getColumnFamilies().stream()
    .filter(family -> family.getName().equals("this_family"))
    .collect(Collectors.toMap(
        //
    ));

标签: javalambdajava-8java-streamcollectors

解决方案


您可以使用flatMap嵌套Stream和展平结构:

Map<String, String> tokenized = tokens.getColumnFamilies().stream()
    .filter(family -> family.getName().equals("this_family"))
    .limit(1)  // equivalent of findAny
    .flatMap(cf -> cf.getColumns().stream())
    .collect(Collectors.toMap(
        Column::getQualifier,
        Column::getValue
    ));

推荐阅读