Como criar uma expressão lambda (Visual Basic)
Uma expressão lambda é uma função ou sub-rotina que não tem um nome. Uma expressão lambda pode ser usada onde quer que um tipo de delegado seja válido.
Para criar uma função de expressão lambda de linha única
Em qualquer situação em que um tipo de delegado possa ser usado, digite a palavra-chave
Function
, como no exemplo a seguir:Dim add1 =
Function
Em parênteses, logo após
Function
, digite os parâmetros da função. Observe que você não especifica um nome apósFunction
.Dim add1 = Function
(num As Integer)
Seguindo a lista de parâmetros, digite uma única expressão como o corpo da função. O valor ao qual a expressão é avaliada é o valor retornado pela função. Você não usa uma
As
cláusula para especificar o tipo de retorno.Dim add1 = Function(num As Integer) num + 1
Você chama a expressão lambda passando um argumento inteiro.
' The following line prints 6. Console.WriteLine(add1(5))
Como alternativa, o mesmo resultado é realizado pelo seguinte exemplo:
Console.WriteLine((Function(num As Integer) num + 1)(5))
Para criar uma sub-rotina de expressão lambda de linha única
Em qualquer situação em que um tipo de delegado possa ser usado, digite a palavra-chave
Sub
, conforme mostrado no exemplo a seguir.Dim add1 =
Sub
Em parênteses, logo após
Sub
, digite os parâmetros da sub-rotina. Observe que você não especifica um nome apósSub
.Dim add1 = Sub
(msg As String)
Seguindo a lista de parâmetros, digite uma única instrução como o corpo da sub-rotina.
Dim writeMessage = Sub(msg As String) Console.WriteLine(msg)
Você chama a expressão lambda passando um argumento de cadeia de caracteres.
' The following line prints "Hello". writeMessage("Hello")
Para criar uma função de expressão lambda de várias linhas
Em qualquer situação em que um tipo de delegado possa ser usado, digite a palavra-chave
Function
, conforme mostrado no exemplo a seguir.Dim add1 =
Function
Em parênteses, logo após
Function
, digite os parâmetros da função. Observe que você não especifica um nome apósFunction
.Dim add1 = Function
(index As Integer)
Pressione ENTER. A
End Function
instrução é adicionada automaticamente.Dentro do corpo da função, adicione o código a seguir para criar uma expressão e retornar o valor. Você não usa uma
As
cláusula para especificar o tipo de retorno.Dim getSortColumn = Function(index As Integer) Select Case index Case 0 Return "FirstName" Case 1 Return "LastName" Case 2 Return "CompanyName" Case Else Return "LastName" End Select End Function
Você chama a expressão lambda passando um argumento inteiro.
Dim sortColumn = getSortColumn(0)
Para criar uma sub-rotina de expressão lambda de várias linhas
Em qualquer situação em que um tipo de delegado possa ser usado, digite a palavra-chave
Sub
, conforme mostrado no exemplo a seguir:Dim add1 =
Sub
Em parênteses, logo após
Sub
, digite os parâmetros da sub-rotina. Observe que você não especifica um nome apósSub
.Dim add1 = Sub
(msg As String)
Pressione ENTER. A
End Sub
instrução é adicionada automaticamente.No corpo da função, adicione o código a seguir para executar quando a sub-rotina for invocada.
Dim writeToLog = Sub(msg As String) Dim log As New EventLog() log.Source = "Application" log.WriteEntry(msg) log.Close() End Sub
Você chama a expressão lambda passando um argumento de cadeia de caracteres.
writeToLog("Application started.")
Exemplo
Um uso comum de expressões lambda é definir uma função que pode ser passada como o argumento para um parâmetro cujo tipo é Delegate
. No exemplo a seguir, o GetProcesses método retorna uma matriz dos processos em execução no computador local. O Where método da Enumerable classe requer um Boolean
delegado como seu argumento. A expressão lambda no exemplo é usada para essa finalidade. Ele retorna True
para cada processo que tem apenas um thread, e eles são selecionados em filteredList
.
Sub Main()
' Create an array of running processes.
Dim procList As Process() = Diagnostics.Process.GetProcesses
' Return the processes that have one thread. Notice that the type
' of the parameter does not have to be explicitly stated.
Dim filteredList = procList.Where(Function(p) p.Threads.Count = 1)
' Display the name of each selected process.
For Each proc In filteredList
MsgBox(proc.ProcessName)
Next
End Sub
O exemplo anterior é equivalente ao código a seguir, que é escrito na sintaxe linq (consulta Language-Integrated):
Sub Main()
Dim filteredQuery = From proc In Diagnostics.Process.GetProcesses
Where proc.Threads.Count = 1
Select proc
For Each proc In filteredQuery
MsgBox(proc.ProcessName)
Next
End Sub