Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

202
Visualizações
¿Por qué las declaraciones throw deben encerrarse con un bloque de código completo en un cuerpo lambda?

Si hay una sola declaración en una función lambda, podemos omitir la definición del bloque de código completo para ella:

 new Thread(() -> System.out.println());

¿Por qué no es ese el caso de las declaraciones que lanzan excepciones? Esto produce un error de compilación que indica '{' expected :

 new Thread(() -> throw new RuntimeException());

Por supuesto, encerrar el cuerpo lambda en un bloque de código funciona:

 new Thread(() -> { throw new RuntimeException(); });
over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

AFAIK El jls dice que el cuerpo lambda tiene que ser:

expresión o un bloque . Tenerlo así:

 new Thread(() -> throw new RuntimeException());

no es ninguno y el compilador de alguna manera te informa sobre eso.

Declarándolo así:

 new Thread(() -> { throw new RuntimeException(); });

lo convierte en un bloque. Aquí está la parte relevante:

Un bloque es una secuencia de instrucciones, declaraciones de clases locales y declaraciones de variables locales entre llaves .

over 4 years ago · Santiago Trujillo Relatório

0

En Java8, la gramática de un cuerpo lambda solo acepta una expresión o un bloque . Mientras que lanzar una excepción es una declaración , no una expresión .

 throwStatement: 'throw' expression ';' ; lambdaBody: expression | block; expression: lambdaExpression | assignmentExpression; block : '{' blockStatements? '}' ;

Tal vez se pueda mejorar al incluir throwStatement en lambdaBody en la próxima versión de jdk si es necesario. De hecho, lo necesitamos como mencionaste anteriormente. por ejemplo:

 lambdaBody: expression | block | throwStatement;
over 4 years ago · Santiago Trujillo Relatório

0

Una declaración throw es, bueno, una declaración y no una expresión, por lo que debe colocarse entre llaves. Según este artículo , el Grupo de expertos de Java realizó una encuesta informal sobre la sintaxis de lambdas en ese momento, y había cuatro opciones:

  • Hombre de paja: #( arglist #(arglist)(expr) and #(arglist){statements}
  • BGGA : { args -> statements } (similar a Scala y Groovy)
  • SotL : #{ args -> statements}
  • Redmond : (args) -> { statements }

En última instancia, la elección fue adoptar una sintaxis similar a la de C# según este hilo , que también se parece más a la última opción anterior hasta donde puedo ver. En C#, hay una distinción entre expresión lambdas y declaración lambdas :

Expresión lambda (C#):

 (input parameters) => expression

Declaración lambda (C#):

 (input parameters) => {statement;}

La sintaxis se explica en esta página de documentación de MSDN .

Y la justificación para elegir esta sintaxis sobre las otras opciones se menciona en el hilo anterior:

La decisión de elegir esta sintaxis fue doble:

  • La sintaxis puntúa "bastante bien" en la mayoría de las medidas subjetivas (aunque tiene casos en los que se ve mal, al igual que todos los demás). En particular, funciona bien con lambdas "pequeñas" que se usan como argumentos de método (un caso común), y también funciona bien con lambdas grandes (de varias instrucciones).

  • A pesar de la extensa búsqueda, no hubo un ganador claro entre las alternativas (cada formulario tenía algunos aspectos buenos y algunos realmente no muy buenos, y no había ningún formulario que fuera claramente mejor que los demás). Por lo tanto, sentimos que era mejor elegir algo que ya se ha demostrado que funciona bien en los dos lenguajes que más se parecen a Java (C# y Scala) en lugar de inventar algo nuevo.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda