Java ruisseaux .orElseThrow
Je veux convertir un morceau de code à partir d'un Pool de connexions de projet, j'ai travaillé sur d'utiliser les flux
le code d'origine est
for (Map.Entry<JdbConnection,Instant> entry : borrowed.entrySet()) {
Instant leaseTime = entry.getValue();
JdbConnection jdbConnection = entry.getKey();
Duration timeElapsed = Duration.between(leaseTime, Instant.now());
if (timeElapsed.toMillis() > leaseTimeInMillis) {
//expired, let's close it and remove it from the map
jdbConnection.close();
borrowed.remove(jdbConnection);
//create a new one, mark it as borrowed and give it to the client
JdbConnection newJdbConnection = factory.create();
borrowed.put(newJdbConnection,Instant.now());
return newJdbConnection;
}
}
throw new ConnectionPoolException("No connections available");
J'en suis arrivé au point de cette
borrowed.entrySet().stream()
.filter(entry -> Duration.between(entry.getValue(), Instant.now()).toMillis() > leaseTimeInMillis)
.findFirst()
.ifPresent(entry -> {
entry.getKey().close();
borrowed.remove(entry.getKey());
});
JdbConnection newJdbConnection = factory.create();
borrowed.put(newJdbConnection,Instant.now());
return newJdbConnection;
Ci-dessus permet de compiler mais au moment où je ajouter orElseThrow
après IfPresent
je suis le suivant
/home/prakashs/connection_pool/src/main/java/com/spakai/ConnectionPool.java:83: error: void cannot be dereferenced
.orElseThrow(ConnectionPoolException::new);
OriginalL'auteur spakai | 2015-12-18
Vous devez vous connecter pour publier un commentaire.
C'est parce que
ifPresent
renvoie void. Il ne peut pas être enchaînés. Vous pourriez faire quelque chose comme:Ce que vous cherchiez serait bien lire:
Mais pour que cela fonctionne,
ifPresent
aurait à retourner leOptional
, ce qui serait un peu bizarre. Cela signifie que vous pourriez chaîne d'unifPresent
après l'autre, de la réalisation de plusieurs opérations sur la valeur. Qui aurait pu être une bonne conception, mais ce n'est pas l'un des créateurs deOptional
suis allé avec.Je recommande
findAny
au lieu defindFirst
Pour ceux qui s'interrogent sur @JeanValjean suggestion, voir question.
FWIW, la raison pour laquelle j'ai collé à l'
findFirst
était parce OP utiliséfindFirst
dans la question. Je ne sais pas si OP avait une raison particulière de le faire, mais je ne voulais pas juste modifier arbitrairement àfindAny
. Bien sûr,findAny
est une performance à la victoire sur les ruisseaux parallèles quand vous pouvez vraiment accepter n'importe quel match, et pas seulement la première.Parfaitement juste @DavidConrad, je voulais juste ajouter d'autres informations, j'ai dû creuser.
OriginalL'auteur David Conrad
Utilisation de la carte au lieu de isPresent, et de revenir avec une Option à la place d'une exception.
OriginalL'auteur ZoltanTheHun