#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,
Я дам ссылку в документах для вас для будущего использования, что важно для функционального программирования.