Procurar corretamente num map

Olá pessoal!

Gostaria de uma ajuda sobre como pegar um valor dentro da iteração de um map. Meu caso é esse:

PlayerEndpoint playerEndpoint;

mapOfUsers.forEach((s, userSession) -> {
	if (userSession.getPlayerEndpoint().getUri().equals(video_url)) {
		playerEndpoint = userSession.getPlayerEndpoint();
	} else {
		playerEndpoint = generatePlayerEndpoint(pipeline, session, video_url);
	}
});

Esse código não é válido, afinal, para usar uma variavel dentro de um map ela deve ser final, como a própria IDE diz.

Mas esse é exatamente a forma que eu preciso montar esse PlayerEndpoint: Se já existir uma conexão, eu reaproveito o endpoint. Se não, crio um novo.

Qualquer contribuição vai me ajudar. Obrigado!

Tenta assim:

PlayerEndpoint playerEndpoint = mapOfUsers.entrySet().stream()
	.map(entry -> entry.getValue())
	.filter(userSession -> userSession.getPlayerEndpoint().getUri().equals(video_url))
	.findFirst()
	.map(userSession -> userSession.getPlayerEndpoint())
	.orElse(generatePlayerEndpoint(pipeline, session, video_url));
2 curtidas

Fantástico, Lucas!

Se eu quiser pegar um elemento pipeline, como eu faria?

Tentei da seguinte forma:

MediaPipeline pipeline = mapOfUsers.entrySet().stream()
                .map(entry -> entry.getValue())
                .filter(userSession -> userSession.getMediaPipeline())
                .findFirst()
                .map(userSession -> userSession.getMediaPipeline())
                .orElse(kurentoClient.createMediaPipeline());

O erro está no filter. Entendo que ele espera uma condição, mas aqui não tem comparação: é, caso exista o endpoint que foi recuperado no código que você me passou, ele pega a pipeline DAQUELE objeto. Deu pra entender?

O que quero fazer é: Se existe o PlayerEndpoint nos critérios definidos, a variável “playerEndpoint” receberá o objeto, e a variavel “pipeline” vai receber a pipeline do playerEndpoint. Se não existir, crio ambos.

Se eu entendi direito, significa que essa chamada userSession.getMediaPipeline() pode retornar null, eh isso? Se sim, vc pode fazer essa verificação no filter mesmo (userSession.getMediaPipeline() != null).

1 curtida