如何使用流从 Map<UUID, List<Generator>> 获取我的对象(生成器)?

How to get my object (Generator) from a Map<UUID, List<Generator>> with streams?

我一直想检查我的生成器的位置并使用流来检查该位置是否有效。

当时的想法如下;

public Generator getGeneratorFromLocation(final Location location) {
        for (List<Generator> generator : playerGeneratorMap.values()) {
            for (Generator generator1 : generator) {
                if (generator1.getGenLocation().equals(location)) {
                    return generator1;
                }
            }
        }
        return null;
    }

我想 return 使用流从中生成一个生成器,而不是尝试学习更多的方法。

当前地图:

public final Map<UUID, List<Generator>> playerGeneratorMap = new HashMap<>();

如有任何帮助,我们将不胜感激。

您可以使用 AtomicRef 对象初始化 retVal,然后在 lambda 表达式中将所需的生成器分配给它,因为不能在 lambda 中分配常规变量,箭头函数中只能使用 final 或 effectivly final。

这个函数应该可以解决问题:)

public Generator getGeneratorFromLocation(final Location location) {

    AtomicReference<Generator> retVal = new AtomicReference<>(null);

    playerGeneratorMap.values().stream().forEach(generators -> {
        generators.forEach(generator -> {
            if (generator.getLocation().equals(location)) {
                retVal.set(generator);
            }
        });
    });

    return retVal.get();
}

顺便说一句,流是不必要的,因为您有 Collection.forEach 而不是 Stream.forEach,流用于更多 'exotic' 类型的迭代,例如 filter、anyMatch、allMatch、reduce以及此类功能,您可以在 Oracle 的网站上阅读有关 Streams API 的信息, 我会 link 在文档中供您将来使用,这对函数式编程很重要。