Как получить мой объект (генератор) из карты <UUID, список > с потоками?

#java-stream #minecraft #bukkit

#java-поток #Minecraft #буккит

Вопрос:

Я давно хотел проверить местоположение моего генератора и использовать потоки, чтобы проверить, действительно ли местоположение.

Идея заключалась в следующем;

 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;
    }
 

Я хочу вернуть генератор из этого, используя потоки вместо этого, чтобы попытаться узнать больше способов сделать это.

Текущая карта:

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

Буду признателен за любую помощь.

Ответ №1:

Вы можете использовать объект AtomicRef для инициализации retVal, а затем назначить ему нужный генератор в лямбда-выражении, потому что обычные переменные не могут быть назначены в лямбда-выражениях, внутри функций со стрелками можно использовать только 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();
}
 

Кстати, потоки не нужны, потому что у вас есть коллекция.forEach вместо Stream.forEach, потоки используются для более «экзотических» типов итераций, таких как filter, anyMatch, allMatch, reduce и подобных функций, вы можете прочитать о Streams API на веб-сайте Oracle,
Я дам ссылку в документах для вас для будущего использования, что важно для функционального программирования.