繁体   English   中英

使用 Java 8 流减少列表的大小

[英]Reduce the size of list with Java 8 stream

我想减小地图对象有序列表的大小(删除一些元素)。 除非满足某个条件,否则应丢弃 list 的所有对象。 当满足该条件时,该列表的所有下一个元素都应保留在列表中。 我有以下一段代码。 我想对 Java 8 做同样的事情。

public List<Map<String, String>> doAction(List<Map<String, String>> dataVoMap) {
    List<Map<String,String>> tempMap = new ArrayList<>();
    boolean found = false;
    for(Map<String, String> map: dataVoMap){
        if(map.get("service_id").equalsIgnoreCase("passed value") || found){
            found = true;
            tempMap.add(map);
        }
    }
    dataVoMap = tempMap;
    return dataVoMap;
}

您正在寻找dropWhile操作,但该操作的内置实现需要 Java-9 及更高版本:

public List<Map<String, String>> doAction(List<Map<String, String>> dataVoMap) {
    return dataVoMap.stream()
            .dropWhile(m -> !"passed value".equalsIgnoreCase(m.get("service_id")))
            .collect(Collectors.toList());
}

注意:我已对现有代码进行了编辑,以避免在List可能存在没有键service_idMap时发生 NPE。

有一个使用小技巧的解决方案:

public static List<Map<String, String>> doAction(List<Map<String, String>> dataVoMap) {
        AtomicBoolean found = new AtomicBoolean(false);
        return dataVoMap.stream()
                .filter(map -> found.get() || "passed value".equalsIgnoreCase(map.get("service_id")))
                .peek(map -> found.set(true))
                .collect(Collectors.toList());
    }

如果您不需要并行流,您可以将此解决方案与 Java 8 一起使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM