Procurar corretamente num map

3 respostas Resolvido
FearX

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!

3 Respostas

Lucas_Camara
Solucao aceita

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));
FearX

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.

Lucas_Camara

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).

Criado 22 de julho de 2020
Ultima resposta 22 de jul. de 2020
Respostas 3
Participantes 2