首页 > 解决方案 > 如何从流集合中删除最后一个元素(DockerClient)

问题描述

嗨,我有一个流集合,我按创建日期对其进行了排序,我需要从这个集合中删除所有元素,但最后一个元素要少:

这是我的代码:

List<com.spotify.docker.client.messages.Image> response = dockerClient.listImages()
          .stream()
          .filter(image -> image.labels() != null && image.labels().containsKey("wantedLabel"))
          .sorted((o1, o2) -> o2.created().compareTo(o1.created()))
          .collect(
              Collectors.toList());

在这个列表中,我的元素按创建日期排序,我需要删除除最后一个元素之外的所有元素。

我试过类似的东西:

 if (response.stream().iterator().hasNext()) {
        response.remove(count);
        count++;
 }

但我想要更复杂的东西,谢谢!

标签: javacollectionsjava-streamspotify-docker-client

解决方案


使用传统循环可以简单高效地解决此任务:

com.spotify.docker.client.messages.Image mostRecent = null;
for(var image: dockerClient.listImages()) {
    if(image.labels() == null || !image.labels().containsKey("wantedLabel")) continue;
    if(mostRecent == null) mostRecent = image;
    else {
        var toRemove = image;
        if(toRemove.created().compareTo(mostRecent.created()) > 0) {
            toRemove = mostRecent;
            mostRecent = image;
        }
        dockerClient.removeImage(toRemove.id());
    }
}

此循环遍历图像并在找到更新的匹配对象后立即删除图像,而无需额外的存储或排序。当循环完成时,除了最近的匹配图像之外的所有图像都已被删除,并且作为奖励,保留的最近对象保存在变量 中mostRecent


推荐阅读