SlideShare uma empresa Scribd logo
1 de 34
LAMBDA
    EXPRESSIONS
Charles Fortes | Marcus Coelho
                  17 de Maio de 2012




                   @CharlesFortes
EXPRESSÕES LAMBDA
Uma   expressão lambda é em sua
      essência uma função anônima.




                 Estas   funções anônimas são geralmente
                 passadas como argumentos para outras funções
                 de mais auto nível...
acessar
...por característica, podem

variáveis no escopo da função na
qual ela está declarada
FacaAlgo(item)
                   {
                     return ++item;
                   }
                   MinhaList.ForEach(item => {
                   var result = FacaAlgo(item);

                   if (result > 5)
                                FacaOutraCoisa();
                   });




FacaAlgo(item)
{
  MessageBox.Show(item);
}
MinhaList.ForEach(item => FacaAlgo);
Suporte a Lambda Expressions nas Linguagens:
LAMBDA NO .NET
No .Net, todas as expressões lambda usam o operador
"=>" (que se lê "vai para" segundo a documentação oficial)




                          Func<int, bool> myFunc = x => x == 5;

                          bool result = myFunc(4); //retorna falso




 O lado  esquerdo da expressão contem os
 parâmetros de entrada, enquanto o lado direito
 possui a expressão ou bloco de instruções
O uso   mais comum são em métodos de consultas
LINQ




var result = minhaListaDeClientes
.Where(cliente => cliente.Endereco.Estado == Estados.Acre)
.select(cliente => cliente.Nome);




                         retorna uma lista de strings com o nome de
                                  todos os clientes do acre
public void Teste()
public void Teste()
{
{
public void Teste()
{      string[] nomes = { "Joao", ... };
       string[] nomes = { "Joao", ... };
{
       string filtro =="J";
       string[] nomes      { "Joao", ... };
       string[] nomes = { "Joao", ... };
       var resultado = nomes.Where(
       var (string nome)!= null
              resultado(string nome)
              delegate = nomes.Where(Filtro);
                        =
              nome => nomenomes.Where(
                            =>
       var resultado
}             {       && nome.StartsWith(filtro)
              nome => nome != null
       );         return nome.StartsWith("J")
                      && nome != null
delegate (string nome)
public bool Filtro(string nome)
}      );             && nome.StartsWith("J");
{
}             }
       return nome != null
       );
} void Teste()&& nome.StartsWith("J");
public
}
Muitos métodos do .NET Framework pedem como
                parâmetro um delegate, ou seja, um objeto
                que poderá chamar indiretamente um
                outro método, sem conhecê-lo.




O método “Where”, por exemplo, está disponível para todas as coleções
do .NET e recebe como parâmetro um método que será utilizado
internamente para avaliar cada item da         coleção e verificar se
cada item atende a um critério especificado.
public void Teste()
{
    string[] nomes = { "Joao", ... };
    var resultado = nomes.Where(Filtro);
}

public bool Filtro(string nome)
{
    return nome != null
        && nome.StartsWith("J");
}



                               “Where” utilizará o método “Filtro” para
          No exemplo acima, o método
          cada item da coleção “nomes”, verificando se o item atende a uma
          condição específica, no caso, se   o nome começa com a letra “J”.
No framework 2.0 foram criados os métodos anônimos,
 que poderiam ser declarados dentro de outros
            métodos, como se fossem variáveis.
O método anônimo em comparação a um método convencional:



•não tem modificador de acessibilidade (public, private) ou nome
(daí o nome “anônimo”)

•deve ser utilizado somente dentro de outros métodos ou variáveis
de escopo de classe;

•utiliza a palavra reservada “delegate”.
public void Teste()
{
    string[] nomes = { "Joao", ... };
    var resultado = nomes.Where(Filtro);
}

delegate (string nome)
{
    return nome != null
        && nome.StartsWith("J");
}
public void Teste()
{
    string[] nomes = { "Joao", ... };
    var resultado = nomes.Where(delegate (string
nome)
       {
       return nome != null
              && nome.StartsWith("J");
       });
}




                     Podemos utilizar o método anônimo direto na
                     chamada do método “Where”.
Para transformar um método anônimo em uma lambda
expression, basta somente remover a palavra “delegate” e
utilizar o símbolo “=>” entre os parâmetros de método, e o
corpo.




         public void Teste()
         {
             string[] nomes = { "Joao", ... };
             var resultado = nomes.Where((string nome) =>
                {
                return nome != null
                       && nome.StartsWith("J");
                });
         }
public void Teste()
{
    string[] nomes = { "Joao", ... };
    var resultado = nomes.Where(nome =>
       {
       return nome != null
              && nome.StartsWith("J");
       });
}




                   Você pode omitir os tipos dos parâmetros nas
                   lambdas expression, deixando somente o nome
                   deste. Quando há somente um único
                   parâmetro, os parênteses também são
                   opcionais.
Quando sua lambda expression possui somente uma linha que
   retorna o resultado do método, você pode omitir também as
chaves, a palavra reservada “return” e o ponto-e-vírgula que finaliza
                       a linha de comando.
public void Teste()
{
    string[] nomes = { "Joao", ... };
    var resultado = nomes
.Where(nome => nome != null
&& nome.StartsWith("J"));
}
Lambdas expressions podem possuir
                             nenhum ou vários parâmetros...

                               x => x > 3;

                               (x, y) => x + y;

                               () => 1;


...e para que executem mais de um
comando, basta colocá-los entre chaves

            x => {
x++;
return x;
}
Um exemplo de uso para a lambda expression é a
utilização para tratar eventos de controles:




    public void Teste()
    {
        buttonSalvar.Click += (obj, args) =>
                 labelMensagem = "Registro salvo com
    sucesso";
    }
Vantagens ao usar
Ao se usar uma lambda expression, seu código
  mais legível, menor, mais auto-explicativo...
Além disto, obtem-se mais desempenho pois são feitas
        otimizações pelo compilador
Vamos fazer um teste simples




checar se um item pertence a lista, se pertencer
adiciona em uma segunda lista através de um
método




                        Há várias formas de fazer isto - inclusive de
                             forma melhor - mas escolhemos a que
                         achamos ser simples de ser compreendida
                                      por todos, e ilustrasse a ideia
Método chamado caso o item exista na lista:




static long add(List<long>dest, long i)
{
    dest.Add(i);
    return i;
}
Fazendo a mesma coisa de várias formas

             for (var i = 0; i < listaA.Count; i++ )
                      {
                         if (listaB.Contains(listaA[i])) add(dest, listaA[i]);
                      }

foreach (var t in listaA)
       {
          if (listaB.Contains(t)) add(dest, t);
       }


              listaA.Where(t => listaB.Contains(t)).Select(t => add(dest, t));



var x = (from t in listaA
             where listaB.Contains(t)
             select add(dest, t)).ToList();
Tempo gasto
EXPRESSÕES
DINÂMICAS
Através da classe Expression podemos criar
lambda expressions dinamicamente.




     Classes específicas representam cada parte da
                                       expressão.
c => c.Codigo == 1

              <LambdaExpression>


         c                   c.Codigo == 1
<ParameterExpression>       <BinaryExpression>




                 c.Codigo                    1
             <MemberExpression>    <ConstantExpression>
PERGUNTAS?
@CharlesFortes

Mais conteúdo relacionado

Mais procurados

Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecas
Maurício Linhares
 
Programando em python funcoes
Programando em python   funcoesProgramando em python   funcoes
Programando em python funcoes
samuelthiago
 

Mais procurados (18)

String
StringString
String
 
Java Desktop
Java DesktopJava Desktop
Java Desktop
 
Curso java 04 - ap is e bibliotecas
Curso java   04 - ap is e bibliotecasCurso java   04 - ap is e bibliotecas
Curso java 04 - ap is e bibliotecas
 
Programação orientada a objetos - IV
Programação orientada a objetos - IVProgramação orientada a objetos - IV
Programação orientada a objetos - IV
 
Programação orientada a objetos – III
Programação orientada a objetos – IIIProgramação orientada a objetos – III
Programação orientada a objetos – III
 
Programando em python funcoes
Programando em python   funcoesProgramando em python   funcoes
Programando em python funcoes
 
Java 07
Java 07Java 07
Java 07
 
TDC 2011 Goiânia: Evolução da linguagem de programação C#
TDC 2011 Goiânia: Evolução da linguagem de programação C#TDC 2011 Goiânia: Evolução da linguagem de programação C#
TDC 2011 Goiânia: Evolução da linguagem de programação C#
 
Haskell
HaskellHaskell
Haskell
 
Minicurso php
Minicurso phpMinicurso php
Minicurso php
 
Java7
Java7Java7
Java7
 
Programação funcional
Programação funcionalProgramação funcional
Programação funcional
 
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
9. Operação toString(); Classes, instâncias e objectos; Scanner – Fundamentos...
 
Java 8 - New Features
Java 8 - New FeaturesJava 8 - New Features
Java 8 - New Features
 
Haskell aula2 tipos-e-classes
Haskell aula2 tipos-e-classesHaskell aula2 tipos-e-classes
Haskell aula2 tipos-e-classes
 
Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1Desenvolvimento iOS - Aula 1
Desenvolvimento iOS - Aula 1
 
Algoritmo Shell Sort
Algoritmo Shell SortAlgoritmo Shell Sort
Algoritmo Shell Sort
 
Semana 4: Atribuições especiais, matrizes, ciclos, classes pacote
Semana  4: Atribuições especiais, matrizes, ciclos, classes pacoteSemana  4: Atribuições especiais, matrizes, ciclos, classes pacote
Semana 4: Atribuições especiais, matrizes, ciclos, classes pacote
 

Destaque

Destaque (20)

Apresentação prof e materia
Apresentação prof e materiaApresentação prof e materia
Apresentação prof e materia
 
Metodologias ageis
Metodologias ageisMetodologias ageis
Metodologias ageis
 
Desenvolvimento de software seguro
Desenvolvimento de software seguroDesenvolvimento de software seguro
Desenvolvimento de software seguro
 
Introdução a Desenvolvimento de Jogos HTML 5 para Windows 8 com Html5Quintus
Introdução a Desenvolvimento de Jogos HTML 5 para Windows 8 com Html5QuintusIntrodução a Desenvolvimento de Jogos HTML 5 para Windows 8 com Html5Quintus
Introdução a Desenvolvimento de Jogos HTML 5 para Windows 8 com Html5Quintus
 
Sistemas Operacionais - Aula 5 - Concorrência
Sistemas Operacionais - Aula 5 - ConcorrênciaSistemas Operacionais - Aula 5 - Concorrência
Sistemas Operacionais - Aula 5 - Concorrência
 
Introdução ao TDD
Introdução ao TDDIntrodução ao TDD
Introdução ao TDD
 
Programação Estruturada 2 - Revisão C
Programação Estruturada 2 - Revisão CProgramação Estruturada 2 - Revisão C
Programação Estruturada 2 - Revisão C
 
PE2 - Funções e Structs
PE2 - Funções e StructsPE2 - Funções e Structs
PE2 - Funções e Structs
 
Sistemas Operacionais - Aula 7 - Processos e Threads
Sistemas Operacionais - Aula 7 - Processos e ThreadsSistemas Operacionais - Aula 7 - Processos e Threads
Sistemas Operacionais - Aula 7 - Processos e Threads
 
PE-I - Apresentação Professor
PE-I - Apresentação ProfessorPE-I - Apresentação Professor
PE-I - Apresentação Professor
 
Conceitos – Do Homem à Máquina
Conceitos – Do Homem à MáquinaConceitos – Do Homem à Máquina
Conceitos – Do Homem à Máquina
 
Programação Genetica
Programação GeneticaProgramação Genetica
Programação Genetica
 
MVC Pattern
MVC PatternMVC Pattern
MVC Pattern
 
IA - Apresentação do Professor
IA - Apresentação do ProfessorIA - Apresentação do Professor
IA - Apresentação do Professor
 
Medição de esforço - Como combrar meus freelas
Medição de esforço - Como combrar meus freelasMedição de esforço - Como combrar meus freelas
Medição de esforço - Como combrar meus freelas
 
Sistemas Operacionais - Aula 9 - Gerencia de Recursos
Sistemas Operacionais - Aula 9 - Gerencia de RecursosSistemas Operacionais - Aula 9 - Gerencia de Recursos
Sistemas Operacionais - Aula 9 - Gerencia de Recursos
 
LPC - aula 1 - Introdução .NET
LPC  - aula 1 - Introdução .NETLPC  - aula 1 - Introdução .NET
LPC - aula 1 - Introdução .NET
 
Programação Estruturada 2 - Apresentação do Professor
Programação Estruturada 2 - Apresentação do ProfessorProgramação Estruturada 2 - Apresentação do Professor
Programação Estruturada 2 - Apresentação do Professor
 
PE1 - Comandos de Decisão
PE1 - Comandos de DecisãoPE1 - Comandos de Decisão
PE1 - Comandos de Decisão
 
Pitagoras - Introdução a Programação Orientada a Objetos - Conceitos
Pitagoras - Introdução a Programação Orientada a Objetos - ConceitosPitagoras - Introdução a Programação Orientada a Objetos - Conceitos
Pitagoras - Introdução a Programação Orientada a Objetos - Conceitos
 

Semelhante a Lambda Expressions

Linguagem de programação implementação de classes
Linguagem de programação   implementação de classesLinguagem de programação   implementação de classes
Linguagem de programação implementação de classes
Carlos Melo
 
Poo1 aula 6 - conversão de tipos primitivos
Poo1   aula 6 - conversão de tipos primitivosPoo1   aula 6 - conversão de tipos primitivos
Poo1 aula 6 - conversão de tipos primitivos
Denis Sobrenome
 
Java orientação a objetos (variaveis de instancia e metodos)
Java   orientação a objetos (variaveis de instancia e metodos)Java   orientação a objetos (variaveis de instancia e metodos)
Java orientação a objetos (variaveis de instancia e metodos)
Armando Daniel
 
007 programando em python - funcoes
007   programando em python - funcoes007   programando em python - funcoes
007 programando em python - funcoes
Leandro Barbosa
 
Curso Básico de Java - Aula 8
Curso Básico de Java - Aula 8 Curso Básico de Java - Aula 8
Curso Básico de Java - Aula 8
PeslPinguim
 

Semelhante a Lambda Expressions (20)

Java - Aula 2 - Orientado a Objetos
Java - Aula 2 - Orientado a ObjetosJava - Aula 2 - Orientado a Objetos
Java - Aula 2 - Orientado a Objetos
 
Aprendendo ruby
Aprendendo rubyAprendendo ruby
Aprendendo ruby
 
Php
PhpPhp
Php
 
Aula4
Aula4Aula4
Aula4
 
Guia Rápido de Referência Java
Guia Rápido de Referência JavaGuia Rápido de Referência Java
Guia Rápido de Referência Java
 
Curso Java Básico - Aula 03
Curso Java Básico - Aula 03Curso Java Básico - Aula 03
Curso Java Básico - Aula 03
 
Linguagem de programação implementação de classes
Linguagem de programação   implementação de classesLinguagem de programação   implementação de classes
Linguagem de programação implementação de classes
 
Poo1 aula 6 - conversão de tipos primitivos
Poo1   aula 6 - conversão de tipos primitivosPoo1   aula 6 - conversão de tipos primitivos
Poo1 aula 6 - conversão de tipos primitivos
 
Java annotation
Java annotationJava annotation
Java annotation
 
Ruby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanosRuby - Criando código para máquinas e humanos
Ruby - Criando código para máquinas e humanos
 
Aula4
Aula4Aula4
Aula4
 
Desenvolvimento de Software
Desenvolvimento de SoftwareDesenvolvimento de Software
Desenvolvimento de Software
 
Programando em Python - Funções
Programando em Python -  FunçõesProgramando em Python -  Funções
Programando em Python - Funções
 
PHP Básico - Parte 3
PHP Básico - Parte 3PHP Básico - Parte 3
PHP Básico - Parte 3
 
Atualização Java 8 (2014)
Atualização Java 8 (2014)Atualização Java 8 (2014)
Atualização Java 8 (2014)
 
tmn - Introdução ao JavaScript
tmn - Introdução ao JavaScripttmn - Introdução ao JavaScript
tmn - Introdução ao JavaScript
 
Java orientação a objetos (variaveis de instancia e metodos)
Java   orientação a objetos (variaveis de instancia e metodos)Java   orientação a objetos (variaveis de instancia e metodos)
Java orientação a objetos (variaveis de instancia e metodos)
 
007 programando em python - funcoes
007   programando em python - funcoes007   programando em python - funcoes
007 programando em python - funcoes
 
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
Fugindo para as colinas com Python - Julio Biason - Tchelinux Bento Gonçalves...
 
Curso Básico de Java - Aula 8
Curso Básico de Java - Aula 8 Curso Básico de Java - Aula 8
Curso Básico de Java - Aula 8
 

Mais de Charles Fortes

Mais de Charles Fortes (15)

Acesso a banco de dados com entity framework
Acesso a banco de dados com entity frameworkAcesso a banco de dados com entity framework
Acesso a banco de dados com entity framework
 
Pdm -final
Pdm  -finalPdm  -final
Pdm -final
 
Pitagoras - Introdução a Programação Orientada a Objetos - Revisão Final
Pitagoras - Introdução a Programação Orientada a Objetos - Revisão FinalPitagoras - Introdução a Programação Orientada a Objetos - Revisão Final
Pitagoras - Introdução a Programação Orientada a Objetos - Revisão Final
 
Pitagoras - Introdução a Programação Orientada a Objetos - Encapsulamento, Ac...
Pitagoras - Introdução a Programação Orientada a Objetos - Encapsulamento, Ac...Pitagoras - Introdução a Programação Orientada a Objetos - Encapsulamento, Ac...
Pitagoras - Introdução a Programação Orientada a Objetos - Encapsulamento, Ac...
 
inteligência artificial - fuzzy - mineração
inteligência artificial - fuzzy - mineraçãointeligência artificial - fuzzy - mineração
inteligência artificial - fuzzy - mineração
 
IA - Introdução Inteligência Artificial
IA - Introdução Inteligência ArtificialIA - Introdução Inteligência Artificial
IA - Introdução Inteligência Artificial
 
PE1 - Revisão e Matéria sobre Laços (FOR, WHILE, DO-WHILE)
PE1 - Revisão e Matéria sobre Laços (FOR, WHILE, DO-WHILE)PE1 - Revisão e Matéria sobre Laços (FOR, WHILE, DO-WHILE)
PE1 - Revisão e Matéria sobre Laços (FOR, WHILE, DO-WHILE)
 
LPC - Apresentação do Professor
LPC - Apresentação do ProfessorLPC - Apresentação do Professor
LPC - Apresentação do Professor
 
Sistemas Operacionais - Aula 8 - Sincronização e Comunicação entre Processos
Sistemas Operacionais - Aula 8 - Sincronização e Comunicação entre ProcessosSistemas Operacionais - Aula 8 - Sincronização e Comunicação entre Processos
Sistemas Operacionais - Aula 8 - Sincronização e Comunicação entre Processos
 
Economia global: França e Inglaterra
Economia global: França e InglaterraEconomia global: França e Inglaterra
Economia global: França e Inglaterra
 
Sistemas Operacionais - Aula 6 - Estrutura do Sistema Operacional
Sistemas Operacionais - Aula 6 - Estrutura do Sistema OperacionalSistemas Operacionais - Aula 6 - Estrutura do Sistema Operacional
Sistemas Operacionais - Aula 6 - Estrutura do Sistema Operacional
 
Sistemas Operacionais - Aula 4 - Revisão e Exercícios
Sistemas Operacionais - Aula 4 - Revisão e ExercíciosSistemas Operacionais - Aula 4 - Revisão e Exercícios
Sistemas Operacionais - Aula 4 - Revisão e Exercícios
 
Sistemas Operacionais - Aula 3 - Hardware e Software
Sistemas Operacionais - Aula 3 - Hardware e SoftwareSistemas Operacionais - Aula 3 - Hardware e Software
Sistemas Operacionais - Aula 3 - Hardware e Software
 
Sistemas Operacionais - Aula 2 - Visão Geral de Sistemas Operacionais
Sistemas Operacionais - Aula 2 - Visão Geral de Sistemas OperacionaisSistemas Operacionais - Aula 2 - Visão Geral de Sistemas Operacionais
Sistemas Operacionais - Aula 2 - Visão Geral de Sistemas Operacionais
 
Sistemas Operacionais - Aula 1 - História e Introdução a SO
Sistemas Operacionais - Aula 1 - História e Introdução a SOSistemas Operacionais - Aula 1 - História e Introdução a SO
Sistemas Operacionais - Aula 1 - História e Introdução a SO
 

Lambda Expressions

  • 1. LAMBDA EXPRESSIONS Charles Fortes | Marcus Coelho 17 de Maio de 2012 @CharlesFortes
  • 3. Uma expressão lambda é em sua essência uma função anônima. Estas funções anônimas são geralmente passadas como argumentos para outras funções de mais auto nível...
  • 4. acessar ...por característica, podem variáveis no escopo da função na qual ela está declarada
  • 5. FacaAlgo(item) { return ++item; } MinhaList.ForEach(item => { var result = FacaAlgo(item); if (result > 5) FacaOutraCoisa(); }); FacaAlgo(item) { MessageBox.Show(item); } MinhaList.ForEach(item => FacaAlgo);
  • 6. Suporte a Lambda Expressions nas Linguagens:
  • 8. No .Net, todas as expressões lambda usam o operador "=>" (que se lê "vai para" segundo a documentação oficial) Func<int, bool> myFunc = x => x == 5; bool result = myFunc(4); //retorna falso O lado esquerdo da expressão contem os parâmetros de entrada, enquanto o lado direito possui a expressão ou bloco de instruções
  • 9. O uso mais comum são em métodos de consultas LINQ var result = minhaListaDeClientes .Where(cliente => cliente.Endereco.Estado == Estados.Acre) .select(cliente => cliente.Nome); retorna uma lista de strings com o nome de todos os clientes do acre
  • 10. public void Teste() public void Teste() { { public void Teste() { string[] nomes = { "Joao", ... }; string[] nomes = { "Joao", ... }; { string filtro =="J"; string[] nomes { "Joao", ... }; string[] nomes = { "Joao", ... }; var resultado = nomes.Where( var (string nome)!= null resultado(string nome) delegate = nomes.Where(Filtro); = nome => nomenomes.Where( => var resultado } { && nome.StartsWith(filtro) nome => nome != null ); return nome.StartsWith("J") && nome != null delegate (string nome) public bool Filtro(string nome) } ); && nome.StartsWith("J"); { } } return nome != null ); } void Teste()&& nome.StartsWith("J"); public }
  • 11. Muitos métodos do .NET Framework pedem como parâmetro um delegate, ou seja, um objeto que poderá chamar indiretamente um outro método, sem conhecê-lo. O método “Where”, por exemplo, está disponível para todas as coleções do .NET e recebe como parâmetro um método que será utilizado internamente para avaliar cada item da coleção e verificar se cada item atende a um critério especificado.
  • 12. public void Teste() { string[] nomes = { "Joao", ... }; var resultado = nomes.Where(Filtro); } public bool Filtro(string nome) { return nome != null && nome.StartsWith("J"); } “Where” utilizará o método “Filtro” para No exemplo acima, o método cada item da coleção “nomes”, verificando se o item atende a uma condição específica, no caso, se o nome começa com a letra “J”.
  • 13. No framework 2.0 foram criados os métodos anônimos, que poderiam ser declarados dentro de outros métodos, como se fossem variáveis.
  • 14. O método anônimo em comparação a um método convencional: •não tem modificador de acessibilidade (public, private) ou nome (daí o nome “anônimo”) •deve ser utilizado somente dentro de outros métodos ou variáveis de escopo de classe; •utiliza a palavra reservada “delegate”.
  • 15. public void Teste() { string[] nomes = { "Joao", ... }; var resultado = nomes.Where(Filtro); } delegate (string nome) { return nome != null && nome.StartsWith("J"); }
  • 16. public void Teste() { string[] nomes = { "Joao", ... }; var resultado = nomes.Where(delegate (string nome) { return nome != null && nome.StartsWith("J"); }); } Podemos utilizar o método anônimo direto na chamada do método “Where”.
  • 17. Para transformar um método anônimo em uma lambda expression, basta somente remover a palavra “delegate” e utilizar o símbolo “=>” entre os parâmetros de método, e o corpo. public void Teste() { string[] nomes = { "Joao", ... }; var resultado = nomes.Where((string nome) => { return nome != null && nome.StartsWith("J"); }); }
  • 18. public void Teste() { string[] nomes = { "Joao", ... }; var resultado = nomes.Where(nome => { return nome != null && nome.StartsWith("J"); }); } Você pode omitir os tipos dos parâmetros nas lambdas expression, deixando somente o nome deste. Quando há somente um único parâmetro, os parênteses também são opcionais.
  • 19. Quando sua lambda expression possui somente uma linha que retorna o resultado do método, você pode omitir também as chaves, a palavra reservada “return” e o ponto-e-vírgula que finaliza a linha de comando.
  • 20. public void Teste() { string[] nomes = { "Joao", ... }; var resultado = nomes .Where(nome => nome != null && nome.StartsWith("J")); }
  • 21. Lambdas expressions podem possuir nenhum ou vários parâmetros...  x => x > 3;  (x, y) => x + y;  () => 1; ...e para que executem mais de um comando, basta colocá-los entre chaves  x => { x++; return x; }
  • 22. Um exemplo de uso para a lambda expression é a utilização para tratar eventos de controles: public void Teste() { buttonSalvar.Click += (obj, args) => labelMensagem = "Registro salvo com sucesso"; }
  • 24. Ao se usar uma lambda expression, seu código mais legível, menor, mais auto-explicativo...
  • 25. Além disto, obtem-se mais desempenho pois são feitas otimizações pelo compilador
  • 26. Vamos fazer um teste simples checar se um item pertence a lista, se pertencer adiciona em uma segunda lista através de um método Há várias formas de fazer isto - inclusive de forma melhor - mas escolhemos a que achamos ser simples de ser compreendida por todos, e ilustrasse a ideia
  • 27. Método chamado caso o item exista na lista: static long add(List<long>dest, long i) { dest.Add(i); return i; }
  • 28. Fazendo a mesma coisa de várias formas for (var i = 0; i < listaA.Count; i++ ) { if (listaB.Contains(listaA[i])) add(dest, listaA[i]); } foreach (var t in listaA) { if (listaB.Contains(t)) add(dest, t); } listaA.Where(t => listaB.Contains(t)).Select(t => add(dest, t)); var x = (from t in listaA where listaB.Contains(t) select add(dest, t)).ToList();
  • 31. Através da classe Expression podemos criar lambda expressions dinamicamente. Classes específicas representam cada parte da expressão.
  • 32. c => c.Codigo == 1 <LambdaExpression> c c.Codigo == 1 <ParameterExpression> <BinaryExpression> c.Codigo 1 <MemberExpression> <ConstantExpression>

Notas do Editor

  1. Microsoft Excelência em Engenharia Confidencial da Microsoft
  2. Microsoft Excelência em Engenharia Confidencial da Microsoft