Giter VIP home page Giter VIP logo

Comments (9)

cami-la avatar cami-la commented on August 12, 2024 3

Boa tarde, @thiagovanzele. Parabéns pelos estudos, viu? Está indo bem!

Deixa eu te mostrar uma forma de fazer. Lembrando que existem outras formas:

  1. Removemos elementos repetidos com distinct() para garantir que a lista tem apenas elementos únicos.
  2. Ordenamos os números na ordem decrescente com sorted(Comparator.reverseOrder()),
  3. Depois pulamos o primeiro número com skip(1)
  4. Encontramos o primeiro elemento após o pulo com findFirst()
  5. Como o findFirst() retorna um Optional, precisamos tratar. Usei aqui o método orElse(null) para obter o valor caso exista. Caso contrário, retorna null.
List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3);

Integer segundoNumero = numeros.stream()
    .distinct()  // Remove elementos repetidos
    .sorted(Comparator.reverseOrder())  // Ordena os números na ordem decrescente
    .skip(1)  // Pula o primeiro número
    .findFirst()  // Encontra o primeiro elemento após o pulo
    .orElse(null);  // Se não encontrar, retorna null

Se ficou alguma dúvida, me avisa que fazemos de outras formas. (:

from ganhando_produtividade_com_stream_api_java.

cami-la avatar cami-la commented on August 12, 2024 2

Parabéns pela resposta, @siqueirarxd. Muito bom! (:

Não sei se você conhece, mas você também poderia utilizar o método orElseThrow(). Porque daí, já lançamos uma exception caso não exista um segundo maior número.

Exemplo de solução:

List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 5, 4, 3);

Integer segundoNumero = numeros.stream()
    .distinct()  // Remove elementos repetidos
    .sorted(Comparator.reverseOrder())  // Ordena os números na ordem decrescente
    .skip(1)  // Pula o primeiro número
    .findFirst()  // Encontra o primeiro elemento após o pulo
    .orElseThrow(() -> new NoSuchElementException("Não existe segundo maior número."));

Bons estudos para nós!

from ganhando_produtividade_com_stream_api_java.

cami-la avatar cami-la commented on August 12, 2024 2

Massa, @willianac.
Parabéns! Não tinha pensando em resolver desse jeito. Aprendi mais uma! Obrigada por compartilhar. <3

from ganhando_produtividade_com_stream_api_java.

willianac avatar willianac commented on August 12, 2024 1

Outra maneira de resolver seria ordenando o array de forma crescente e pegando o penúltimo elemento, consequentemente o segundo mais alto. Utilizando também o distinct() para que ele não pegue o elemento mais alto caso o mais alto se repita.

  List<Integer> numerosOrdenado = numeros.stream()
    .sorted()
    .distinct()
    .collect(Collectors.toList());

  int segundoMaisAlto = numerosOrdenado.get(numerosOrdenado.size() - 2));

from ganhando_produtividade_com_stream_api_java.

jpvalim avatar jpvalim commented on August 12, 2024 1

Olha como ficou o meu...

public class Desafio7 {
    public static void main(String[] args) {
        List<Integer> numeros = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 5, 4, 10);
        Optional<Integer> primeiroMaior = numeros.stream().max(Integer::compareTo);
        
        Integer x =  numeros.stream().reduce(0, (Integer n, Integer n2)-> {
           return (n2 > n && n2 < primeiroMaior.get()) ? n2 : n;
        });
        System.out.println("Numero reduce: " + x);

    }
}

from ganhando_produtividade_com_stream_api_java.

cami-la avatar cami-la commented on August 12, 2024 1

Parabéns, @jpvalim. Só ficou um mais complexa a solução. Mas chegando no resultado, ótimo!
Mais uma vez parabéns pelos estudos! (:

from ganhando_produtividade_com_stream_api_java.

andersoncpdq avatar andersoncpdq commented on August 12, 2024 1

Usei o limit hehe

numbers.stream().sorted(Collections.reverseOrder()).skip(1).limit(1).forEach(System.out::println);

from ganhando_produtividade_com_stream_api_java.

thiagovanzele avatar thiagovanzele commented on August 12, 2024

int segundoMaior = numeros.stream().sorted().toList().get(11);
Fiz desse jeito, na prática deu certo, mas como disse, não parece a maneira correta...

from ganhando_produtividade_com_stream_api_java.

siqueirarxd avatar siqueirarxd commented on August 12, 2024

System.out.println(nums.stream().distinct().sorted((a, b) -> b.compareTo(a)).skip(1).findFirst().orElse(null));

Fiz assim. Tive que usar um recurso de optional, mesmo não assistindo o vídeo sobre essa parte ainda. Mas acho que ficou mais dinâmico, visto que você pode adicionar números na lista depois e o código ainda assim retornar o resultado correto.

from ganhando_produtividade_com_stream_api_java.

Related Issues (18)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.