Coleções Scala - Guia rápido

Scala tem um rico conjunto de biblioteca de coleção. Coleções são contêineres de coisas. Esses recipientes podem ser sequenciados, conjuntos lineares de itens como Lista, Tupla, Opção, Mapa, etc. As coleções podem ter um número arbitrário de elementos ou ser limitadas a zero ou um elemento (por exemplo, Opção).

As coleções podem ser strict ou lazy. As coleções lentas têm elementos que podem não consumir memória até que sejam acessadas, comoRanges. Além disso, as coleções podem sermutable (o conteúdo da referência pode mudar) ou immutable(aquilo a que uma referência se refere nunca é alterado). Observe que as coleções imutáveis ​​podem conter itens mutáveis.

Para alguns problemas, as coleções mutáveis ​​funcionam melhor e, para outros, as coleções imutáveis ​​funcionam melhor. Em caso de dúvida, é melhor começar com uma coleção imutável e alterá-la mais tarde se precisar de uma coleção mutável.

Este capítulo lança luz sobre os tipos de coleção mais comumente usados ​​e as operações mais frequentemente usadas sobre essas coleções.

Sr. Não Coleções com Descrição
1

Scala Lists

Lista de Scala [T] é uma lista vinculada do tipo T.

2

Scala Sets

Um conjunto é uma coleção de elementos diferentes entre pares do mesmo tipo.

3

Scala Maps

Um mapa é uma coleção de pares de chave / valor. Qualquer valor pode ser recuperado com base em sua chave.

4

Scala Tuples

Ao contrário de uma matriz ou lista, uma tupla pode conter objetos com diferentes tipos.

5

Scala Options

A opção [T] fornece um contêiner para zero ou um elemento de um determinado tipo.

6

Scala Iterators

Um iterador não é uma coleção, mas sim uma maneira de acessar os elementos de uma coleção um por um.

Scala pode ser instalado em qualquer sistema baseado em UNIX ou Windows. Antes de iniciar a instalação do Scala em sua máquina, você deve ter o Java 1.8 ou superior instalado em seu computador.

Siga as etapas abaixo para instalar o Scala.

Etapa 1: verifique sua instalação Java

Em primeiro lugar, você precisa ter o Java Software Development Kit (SDK) instalado em seu sistema. Para verificar isso, execute qualquer um dos dois comandos a seguir, dependendo da plataforma em que está trabalhando.

Se a instalação do Java foi feita corretamente, ele exibirá a versão atual e as especificações de sua instalação do Java. Um exemplo de saída é fornecido na tabela a seguir.

Plataforma Comando Saída de amostra
janelas

Abra o console de comando e digite -

\>java -version

Versão Java "1.8.0_31"

Tempo de execução Java (TM) SE

Ambiente (versão 1.8.0_31-b31)

Servidor Java Hotspot (TM) de 64 bits

VM (versão 25.31-b07, modo misto)

Linux

Abra o terminal de comando e digite -

$java -version

Versão Java "1.8.0_31"

Ambiente de tempo de execução JDK aberto (rhel-2.8.10.4.el6_4-x86_64)

Abra o servidor VM JDK de 64 bits (versão 25.31-b07, modo misto)

Presumimos que os leitores deste tutorial tenham o Java SDK versão 1.8.0_31 instalado em seus sistemas.

Caso você não tenha Java SDK, baixe sua versão atual em https://www.oracle.com/technetwork/java/javase/downloads/index.html e instale-o.

Etapa 2: definir seu ambiente Java

Defina a variável de ambiente JAVA_HOME para apontar para o local do diretório base onde o Java está instalado em sua máquina. Por exemplo,

Sr. Não Plataforma e descrição
1

Windows

Defina JAVA_HOME como C: \ ProgramFiles \ java \ jdk1.8.0_31

2

Linux

Exportar JAVA_HOME = / usr / local / java-current

Anexe o caminho completo do local do compilador Java ao caminho do sistema.

Sr. Não Plataforma e descrição
1

Windows

Anexe a string "C: \ Arquivos de programas \ Java \ jdk1.8.0_31 \ bin" ao final da variável de sistema PATH.

2

Linux

Exportar PATH = $ PATH: $ JAVA_HOME / bin /

Execute o comando java -version no prompt de comando, conforme explicado acima.

Etapa 3: Instale o Scala

Você pode baixar o Scala em www.scala-lang.org/downloads . No momento em que escrevi este tutorial, eu baixei 'scala-2.13.1-installer.jar'. Certifique-se de ter privilégios de administrador para continuar. Agora, execute o seguinte comando no prompt de comando -

Plataforma Comando e Saída Descrição
janelas

\> java -jar scala-2.13.1-installer.jar \>

Este comando exibirá um assistente de instalação, que o guiará na instalação do Scala em sua máquina Windows. Durante a instalação, ele solicitará um contrato de licença, simplesmente aceite-o e, em seguida, ele solicitará um caminho onde o Scala será instalado. Selecionei o caminho padrão fornecido "C: \ Arquivos de programas \ Scala", você pode selecionar um caminho adequado conforme sua conveniência.

Linux

Command -

$ java -jar scala-2.13.1-installer.jar

Output -

Bem-vindo à instalação do Scala 2.13.1!

A página inicial está em - http://Scala-lang.org/

pressione 1 para continuar, 2 para sair, 3 para exibir novamente

1 ................................................

[Começando a desempacotar]

[Processando pacote: Instalação do Pacote de Software (1/1)]

[Desembalagem concluída]

[Instalação do console concluída]

Durante a instalação, ele pedirá um contrato de licença, para aceitá-lo digite 1 e pedirá um caminho onde o Scala será instalado. Entrei em / usr / local / share, você pode selecionar um caminho adequado de acordo com sua conveniência.

Por fim, abra um novo prompt de comando e digite Scala -versione pressione Enter. Você deve ver o seguinte -

Plataforma Comando Resultado
janelas

\> scala -version

Scala code runner versão 2.13.1 - Copyright 2002-2019, LAMP / EPFL e Lightbend, Inc.

Linux

$ scala -version

Scala code runner versão 2.13.1 - Copyright 2002-2019, LAMP / EPFL e Lightbend, Inc.tut

Scala fornece uma estrutura de dados, o array, que armazena uma coleção sequencial de tamanho fixo de elementos do mesmo tipo. Uma matriz é usada para armazenar uma coleção de dados, mas geralmente é mais útil pensar em uma matriz como uma coleção de variáveis ​​do mesmo tipo.

Em vez de declarar variáveis ​​individuais, como número0, número1, ... e número99, você declara uma variável de matriz, como números e usa números [0], números [1] e ..., números [99] para representar variáveis ​​individuais. Este tutorial apresenta como declarar variáveis ​​de array, criar arrays e processar arrays usando variáveis ​​indexadas. O índice do primeiro elemento de uma matriz é o número zero e o índice do último elemento é o número total de elementos menos um.

Declarando Variáveis ​​de Matriz

Para usar uma matriz em um programa, você deve declarar uma variável para fazer referência à matriz e deve especificar o tipo de matriz que a variável pode fazer referência.

A seguir está a sintaxe para declarar uma variável de matriz.

Sintaxe

var z:Array[String] = new Array[String](3)

or

var z = new Array[String](3)

Aqui, z é declarado como uma matriz de Strings que pode conter até três elementos. Os valores podem ser atribuídos a elementos individuais ou obter acesso a elementos individuais, isso pode ser feito usando comandos como o seguinte -

Comando

z(0) = "Zara"; z(1) = "Nuha"; z(4/2) = "Ayan"

Aqui, o último exemplo mostra que, em geral, o índice pode ser qualquer expressão que produza um número inteiro. Existe mais uma maneira de definir uma matriz -

var z = Array("Zara", "Nuha", "Ayan")

A imagem a seguir representa uma matriz myList. Aqui,myList possui dez valores duplos e os índices vão de 0 a 9.

Processando matrizes

Ao processar elementos de array, frequentemente usamos estruturas de controle de loop porque todos os elementos em um array são do mesmo tipo e o tamanho do array é conhecido.

Abaixo está um programa de exemplo mostrando como criar, inicializar e processar matrizes -

Exemplo

object Demo {
   def main(args: Array[String]) {
      var myList = Array(1.9, 2.9, 3.4, 3.5)
      
      // Print all the array elements
      for ( x <- myList ) {
         println( x )
      }
      // Summing all elements
      var total = 0.0;
      for ( i <- 0 to (myList.length - 1)) {
         total += myList(i);
      }
      println("Total is " + total);
      // Finding the largest element
      var max = myList(0);
      for ( i <- 1 to (myList.length - 1) ) {
         if (myList(i) > max) max = myList(i);
      }
      println("Max is " + max);
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

1.9
2.9
3.4
3.5
Total is 11.7
Max is 3.5

Scala não suporta diretamente várias operações de array e fornece vários métodos para processar arrays em qualquer dimensão. Se você quiser usar os diferentes métodos, é necessário importarArray._ pacote.

Existem muitas situações em que você precisaria definir e usar arrays multidimensionais (ou seja, arrays cujos elementos são arrays). Por exemplo, matrizes e tabelas são exemplos de estruturas que podem ser realizadas como matrizes bidimensionais.

A seguir está o exemplo de definição de uma matriz bidimensional -

var myMatrix = ofDim[Int](3,3)

Este é um array com três elementos, cada um sendo um array de inteiros com três elementos.

Experimente o programa de exemplo a seguir para processar uma matriz multidimensional -

Exemplo

import Array._
object Demo {
   def main(args: Array[String]) {
      var myMatrix = ofDim[Int](3,3)
      // build a matrix
      for (i <- 0 to 2) {
         for ( j <- 0 to 2) {
            myMatrix(i)(j) = j;
         }
      }
      // Print two dimensional array
      for (i <- 0 to 2) {
         for ( j <- 0 to 2) {
            print(" " + myMatrix(i)(j));
         }
         println();
      }
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

0 1 2
0 1 2
0 1 2

Uso do método range () para gerar uma matriz contendo uma sequência de números inteiros crescentes em um determinado intervalo. Você pode usar o argumento final como etapa para criar a sequência; se você não usar o argumento final, o passo será assumido como 1.

Vejamos um exemplo de criação de uma matriz de intervalo (10, 20, 2): Significa criar uma matriz com elementos entre 10 e 20 e diferença de intervalo 2. Os elementos da matriz são 10, 12, 14, 16 e 18 .

Outro exemplo: intervalo (10, 20). Aqui a diferença de intervalo não é fornecida, por padrão, assume 1 elemento. Ele cria uma matriz com os elementos entre 10 e 20 com diferença de intervalo 1. Os elementos da matriz são 10, 11, 12, 13, ... e 19.

O programa de exemplo a seguir mostra como criar uma matriz com intervalos.

Exemplo

import Array._
object Demo {
   def main(args: Array[String]) {
      var myList1 = range(10, 20, 2)
      var myList2 = range(10,20)
      // Print all the array elements
      for ( x <- myList1 ) {
         print( " " + x )
      }
      println()
      for ( x <- myList2 ) {
         print( " " + x )
      }
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

10 12 14 16 18
10 11 12 13 14 15 16 17 18 19

Scala fornece uma estrutura de dados, o ArrayBuffer, que pode mudar de tamanho quando o tamanho inicial for insuficiente. Como o array tem um tamanho fixo e mais elementos não podem ser ocupados em um array, ArrayBuffer é uma alternativa para o array onde o tamanho é flexível.

Internamente, o ArrayBuffer mantém uma matriz do tamanho atual para armazenar elementos. Quando um novo elemento é adicionado, o tamanho é verificado. No caso do array subjacente estar cheio, um novo array maior é criado e todos os elementos são copiados para um array maior.

Declarando Variáveis ​​ArrayBuffer

A seguir está a sintaxe para declarar uma variável ArrayBuffer.

Sintaxe

var z = ArrayBuffer[String]()

Aqui, z é declarado como um buffer de matriz de Strings que está inicialmente vazio. Os valores podem ser adicionados usando comandos como os seguintes -

Comando

z += "Zara";
z += "Nuha";
z += "Ayan";

Processando ArrayBuffer

Abaixo está um programa de exemplo mostrando como criar, inicializar e processar ArrayBuffer -

Exemplo

import scala.collection.mutable.ArrayBuffer 
object Demo {
   def main(args: Array[String]) = {
      var myList = ArrayBuffer("Zara","Nuha","Ayan")
      println(myList);
      // Add an element
      myList += "Welcome";
      // Add two element
      myList += ("To", "Tutorialspoint");
      println(myList);
      // Remove an element
      myList -= "Welcome";
      // print second element
      println(myList(1));
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

ArrayBuffer(Zara, Nuha, Ayan)
ArrayBuffer(Zara, Nuha, Ayan, Welcome, To, Tutorialspoint)
Nuha

Scala Lists são bastante semelhantes a arrays, o que significa que todos os elementos de uma lista têm o mesmo tipo, mas existem duas diferenças importantes. Primeiro, as listas são imutáveis, o que significa que os elementos de uma lista não podem ser alterados por atribuição. Em segundo lugar, as listas representam uma lista vinculada, enquanto as matrizes são simples.

O tipo de lista que possui elementos do tipo T é escrito como List[T].

Tente o exemplo a seguir, aqui estão algumas listas definidas para vários tipos de dados.

// List of Strings
val fruit: List[String] = List("apples", "oranges", "pears")
// List of Integers
val nums: List[Int] = List(1, 2, 3, 4)
// Empty List.
val empty: List[Nothing] = List()
// Two dimensional list
val dim: List[List[Int]] = List(
   List(1, 0, 0),
   List(0, 1, 0),
   List(0, 0, 1)
)

Todas as listas podem ser definidas usando dois blocos de construção fundamentais, uma cauda Nil e ::, que é pronunciado cons. Nil também representa a lista vazia. Todas as listas acima podem ser definidas como segue.

// List of Strings
val fruit = "apples" :: ("oranges" :: ("pears" :: Nil))
// List of Integers
val nums = 1 :: (2 :: (3 :: (4 :: Nil)))
// Empty List.
val empty = Nil
// Two dimensional list
val dim = (1 :: (0 :: (0 :: Nil))) ::
   (0 :: (1 :: (0 :: Nil))) ::
   (0 :: (0 :: (1 :: Nil))) :: Nil

Operações básicas em listas

Todas as operações nas listas podem ser expressas em termos dos três métodos a seguir.

Sr. Não Métodos e Descrição
1

head

Este método retorna o primeiro elemento de uma lista.

2

tail

Este método retorna uma lista que consiste em todos os elementos, exceto o primeiro.

3

isEmpty

Este método retorna verdadeiro se a lista estiver vazia, caso contrário, é falso.

O exemplo a seguir mostra como usar os métodos acima.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val fruit = "apples" :: ("oranges" :: ("pears" :: Nil))
      val nums = Nil
      println( "Head of fruit : " + fruit.head )
      println( "Tail of fruit : " + fruit.tail )
      println( "Check if fruit is empty : " + fruit.isEmpty )
      println( "Check if nums is empty : " + nums.isEmpty )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Head of fruit : apples
Tail of fruit : List(oranges, pears)
Check if fruit is empty : false
Check if nums is empty : true

Listas de concatenação

Você pode usar qualquer ::: operador ou List.:::() método ou List.concat()método para adicionar duas ou mais listas. Encontre o seguinte exemplo fornecido abaixo -

Exemplo

object Demo {
   def main(args: Array[String]) {
      val fruit1 = "apples" :: ("oranges" :: ("pears" :: Nil))
      val fruit2 = "mangoes" :: ("banana" :: Nil)
      // use two or more lists with ::: operator
      var fruit = fruit1 ::: fruit2
      println( "fruit1 ::: fruit2 : " + fruit )
      // use two lists with Set.:::() method
      fruit = fruit1.:::(fruit2)
      println( "fruit1.:::(fruit2) : " + fruit )
      // pass two or more lists as arguments
      fruit = List.concat(fruit1, fruit2)
      println( "List.concat(fruit1, fruit2) : " + fruit  )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

fruit1 ::: fruit2 : List(apples, oranges, pears, mangoes, banana)
fruit1.:::(fruit2) : List(mangoes, banana, apples, oranges, pears)
List.concat(fruit1, fruit2) : List(apples, oranges, pears, mangoes, banana)

Criação de listas uniformes

Você pode usar List.fill()método cria uma lista que consiste em zero ou mais cópias do mesmo elemento. Experimente o seguinte programa de exemplo.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val fruit = List.fill(3)("apples") // Repeats apples three times.
      println( "fruit : " + fruit  )
      val num = List.fill(10)(2)         // Repeats 2, 10 times.
      println( "num : " + num  )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

fruit : List(apples, apples, apples)
num : List(2, 2, 2, 2, 2, 2, 2, 2, 2, 2)

Tabulando uma função

Você pode usar uma função junto com List.tabulate()método para aplicar em todos os elementos da lista antes de tabular a lista. Seus argumentos são como os de List.fill: a primeira lista de argumentos fornece as dimensões da lista a ser criada e a segunda descreve os elementos da lista. A única diferença é que em vez de os elementos serem fixos, eles são calculados a partir de uma função.

Experimente o seguinte programa de exemplo.

Exemplo

object Demo {
   def main(args: Array[String]) {
      // Creates 5 elements using the given function.
      val squares = List.tabulate(6)(n => n * n)
      println( "squares : " + squares  )
      val mul = List.tabulate( 4,5 )( _ * _ )      
      println( "mul : " + mul  )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

squares : List(0, 1, 4, 9, 16, 25)
mul : List(List(0, 0, 0, 0, 0), List(0, 1, 2, 3, 4), 
   List(0, 2, 4, 6, 8), List(0, 3, 6, 9, 12))

Ordem reversa da lista

Você pode usar List.reversemétodo para reverter todos os elementos da lista. O exemplo a seguir mostra o uso.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val fruit = "apples" :: ("oranges" :: ("pears" :: Nil))
      println( "Before reverse fruit : " + fruit )
      println( "After reverse fruit : " + fruit.reverse )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Before reverse fruit : List(apples, oranges, pears)
After reverse fruit : List(pears, oranges, apples)

Scala fornece uma estrutura de dados, o ListBuffer, que é mais eficiente do que List ao adicionar / remover elementos em uma lista. Ele fornece métodos para preceder, acrescentar elementos a uma lista.

Declarando Variáveis ​​ListBuffer

A seguir está a sintaxe para declarar uma variável ListBuffer.

Sintaxe

var z = ListBuffer[String]()

Aqui, z é declarado como um buffer de lista de Strings que está inicialmente vazio. Os valores podem ser adicionados usando comandos como os seguintes -

Comando

z += "Zara";
z += "Nuha";
z += "Ayan";

Processando ListBuffer

Abaixo está um exemplo de programa mostrando como criar, inicializar e processar ListBuffer -

Exemplo

import scala.collection.mutable.ListBuffer 
object Demo {
   def main(args: Array[String]) = {
      var myList = ListBuffer("Zara","Nuha","Ayan")
      println(myList);
      // Add an element
      myList += "Welcome";
      // Add two element
      myList += ("To", "Tutorialspoint");
      println(myList);
      // Remove an element
      myList -= "Welcome";
      // print second element
      println(myList(1));
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

ListBuffer(Zara, Nuha, Ayan)
ListBuffer(Zara, Nuha, Ayan, Welcome, To, Tutorialspoint)
Nuha

Scala Set é uma coleção de elementos diferentes em pares do mesmo tipo. Em outras palavras, um conjunto é uma coleção que não contém elementos duplicados. ListSet implementa conjuntos imutáveis ​​e usa estrutura de lista. A ordem de inserção dos elementos é preservada durante o armazenamento dos elementos.

Declaração de variáveis ​​ListSet

A seguir está a sintaxe para declarar uma variável ListSet.

Sintaxe

var z : ListSet[String] = ListSet("Zara","Nuha","Ayan")

Aqui, z é declarado como um conjunto de listas de Strings que possui três membros. Os valores podem ser adicionados usando comandos como os seguintes -

Comando

var myList1: ListSet[String] = myList + "Naira";

Processando ListSet

Abaixo está um exemplo de programa mostrando como criar, inicializar e processar ListSet -

Exemplo

import scala.collection.immutable.ListSet
object Demo {
   def main(args: Array[String]) = {
      var myList: ListSet[String] = ListSet("Zara","Nuha","Ayan");
      // Add an element
      var myList1: ListSet[String] = myList + "Naira";
      // Remove an element
      var myList2: ListSet[String] = myList - "Nuha";
      // Create empty set
      var myList3: ListSet[String] = ListSet.empty[String];
      println(myList);
      println(myList1);
      println(myList2);
      println(myList3);	  
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

ListSet(Zara, Nuha, Ayan)
ListSet(Zara, Nuha, Ayan, Naira)
ListSet(Zara, Ayan)
ListSet()

Scala Vector é uma estrutura de dados imutável de propósito geral onde os elementos podem ser acessados ​​aleatoriamente. Geralmente é usado para grandes coleções de dados.

Declaração de variáveis ​​vetoriais

A seguir está a sintaxe para declarar uma variável Vector.

Sintaxe

var z : Vector[String] = Vector("Zara","Nuha","Ayan")

Aqui, z é declarado como um vetor de Strings que possui três membros. Os valores podem ser adicionados usando comandos como os seguintes -

Comando

var vector1: Vector[String] = z + "Naira";

Processando Vetor

Abaixo está um exemplo de programa mostrando como criar, inicializar e processar Vector -

Exemplo

import scala.collection.immutable.Vector
object Demo {
   def main(args: Array[String]) = {
      var vector: Vector[String] = Vector("Zara","Nuha","Ayan");
      // Add an element
      var vector1: Vector[String] = vector :+ "Naira";
      // Reverse an element
      var vector2: Vector[String] = vector.reverse;
      // sort a vector
      var vector3: Vector[String] = vector1.sorted;
      println(vector);
      println(vector1);
      println(vector2);
      println(vector3);	  
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Vector(Zara, Nuha, Ayan)
Vector(Zara, Nuha, Ayan, Naira)
Vector(Ayan, Nuha, Zara)
Vector(Ayan, Naira, Nuha, Zara)

Scala Set é uma coleção de elementos diferentes em pares do mesmo tipo. Em outras palavras, um conjunto é uma coleção que não contém elementos duplicados. Existem dois tipos de conjuntos, oimmutable e a mutable. A diferença entre objetos mutáveis ​​e imutáveis ​​é que quando um objeto é imutável, o próprio objeto não pode ser alterado.

Por padrão, Scala usa o Conjunto imutável. Se você quiser usar o conjunto mutável, você terá que importarscala.collection.mutable.Setclasse explicitamente. Se você deseja usar conjuntos mutáveis ​​e imutáveis ​​na mesma coleção, pode continuar a referir-se ao conjunto imutável comoSet mas você pode se referir ao conjunto mutável como mutable.Set.

Aqui está como você pode declarar conjuntos imutáveis ​​-

Sintaxe

// Empty set of integer type
var s : Set[Int] = Set()
// Set of integer type
var s : Set[Int] = Set(1,3,5,7)

or 

var s = Set(1,3,5,7)

Ao definir um conjunto vazio, a anotação de tipo é necessária, pois o sistema precisa atribuir um tipo concreto à variável.

Operações básicas no set

Todas as operações em conjuntos podem ser expressas em termos dos seguintes três métodos -

Sr. Não Métodos e Descrição
1

head

Este método retorna o primeiro elemento de um conjunto.

2

tail

Este método retorna um conjunto que consiste em todos os elementos, exceto o primeiro.

3

isEmpty

Este método retorna verdadeiro se o conjunto estiver vazio, caso contrário, é falso.

Experimente o exemplo a seguir, mostrando o uso dos métodos operacionais básicos -

Exemplo

object Demo {
   def main(args: Array[String]) {
      val fruit = Set("apples", "oranges", "pears")
      val nums: Set[Int] = Set()
      println( "Head of fruit : " + fruit.head )
      println( "Tail of fruit : " + fruit.tail )
      println( "Check if fruit is empty : " + fruit.isEmpty )
      println( "Check if nums is empty : " + nums.isEmpty )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Head of fruit : apples
Tail of fruit : Set(oranges, pears)
Check if fruit is empty : false
Check if nums is empty : true

Conjuntos de concatenação

Você pode usar qualquer ++ operador ou Set.++() método para concatenar dois ou mais conjuntos, mas ao adicionar conjuntos removerá elementos duplicados.

A seguir está o exemplo para concatenar dois conjuntos.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val fruit1 = Set("apples", "oranges", "pears")
      val fruit2 = Set("mangoes", "banana")
      // use two or more sets with ++ as operator
      var fruit = fruit1 ++ fruit2
      println( "fruit1 ++ fruit2 : " + fruit )
      // use two sets with ++ as method
      fruit = fruit1.++(fruit2)
      println( "fruit1.++(fruit2) : " + fruit )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

fruit1 ++ fruit2 : Set(banana, apples, mangoes, pears, oranges)
fruit1.++(fruit2) : Set(banana, apples, mangoes, pears, oranges)

Encontre o máximo e o mínimo de elementos em um conjunto

Você pode usar Set.min método para descobrir o mínimo e Set.maxmétodo para descobrir o máximo de elementos disponíveis em um conjunto. A seguir está o exemplo para mostrar o programa.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val num = Set(5,6,9,20,30,45)
      // find min and max of the elements
      println( "Min element in Set(5,6,9,20,30,45) : " + num.min )
      println( "Max element in Set(5,6,9,20,30,45) : " + num.max )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Min element in Set(5,6,9,20,30,45) : 5
Max element in Set(5,6,9,20,30,45) : 45

Encontre inserções de valores comuns

Você pode usar qualquer Set.& método ou Set.intersectmétodo para descobrir os valores comuns entre dois conjuntos. Experimente o seguinte exemplo para mostrar o uso.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val num1 = Set(5,6,9,20,30,45)
      val num2 = Set(50,60,9,20,35,55)
      // find common elements between two sets
      println( "num1.&(num2) : " + num1.&(num2) )
      println( "num1.intersect(num2) : " + num1.intersect(num2) )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

num1.&(num2) : Set(20, 9)
num1.intersect(num2) : Set(20, 9)

Bitset é uma classe base comum para bitsets mutáveis ​​e imutáveis. Os conjuntos de bits são conjuntos de inteiros não negativos e são representados como matrizes de tamanho variável de bits compactados em palavras de 64 bits. A área de cobertura da memória de um bitset é representada pelo maior número armazenado nele.

Declarando Variáveis ​​BitSet

A seguir está a sintaxe para declarar uma variável BitSet.

Sintaxe

var z : BitSet = BitSet(0,1,2)

Aqui, z é declarado como um conjunto de bits de inteiros não negativos que possui três membros. Os valores podem ser adicionados usando comandos como os seguintes -

Comando

var myList1: BitSet = myList + 3;

Processando BitSet

Abaixo está um exemplo de programa mostrando como criar, inicializar e processar BitSet -

Exemplo

import scala.collection.immutable.BitSet

object Demo {
   def main(args: Array[String]) = {
      var mySet: BitSet = BitSet(0, 1, 2);
      // Add an element
      var mySet1: BitSet = mySet + 3;
      // Remove an element
      var mySet2: BitSet = mySet - 2;
      var mySet3: BitSet = BitSet(4, 5);
      // Adding sets
      var mySet4: BitSet = mySet1 ++ mySet3;
      println(mySet);
      println(mySet1);
      println(mySet2);
      println(mySet4);	  
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

BitSet(0, 1, 2)
BitSet(0, 1, 2, 3)
BitSet(0, 1)
BitSet(0, 1, 2, 3, 4, 5)

Scala Set é uma coleção de elementos diferentes em pares do mesmo tipo. Em outras palavras, um conjunto é uma coleção que não contém elementos duplicados. HashSet implementa conjuntos imutáveis ​​e usa tabela de hash. A ordem de inserção dos elementos não é preservada.

Declarando Variáveis ​​HashSet

A seguir está a sintaxe para declarar uma variável HashSet.

Sintaxe

var z : HashSet[String] = HashSet("Zara","Nuha","Ayan")

Aqui, z é declarado como um conjunto hash de Strings que possui três membros. Os valores podem ser adicionados usando comandos como os seguintes -

Comando

var myList1: HashSet[String] = myList + "Naira";

Processando HashSet

Abaixo está um exemplo de programa mostrando como criar, inicializar e processar HashSet -

Exemplo

import scala.collection.immutable.HashSet
object Demo {
   def main(args: Array[String]) = {
      var mySet: HashSet[String] = HashSet("Zara","Nuha","Ayan");
      // Add an element
      var mySet1: HashSet[String] = mySet + "Naira";
      // Remove an element
      var mySet2: HashSet[String] = mySet - "Nuha";
      // Create empty set
      var mySet3: HashSet[String] = HashSet.empty[String];
      println(mySet);
      println(mySet1);
      println(mySet2);
      println(mySet3);	  
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

HashSet(Zara, Nuha, Ayan)
HashSet(Zara, Nuha, Ayan, Naira)
HashSet(Zara, Ayan)
HashSet()

Scala Set é uma coleção de elementos diferentes em pares do mesmo tipo. Em outras palavras, um conjunto é uma coleção que não contém elementos duplicados. TreeSet implementa conjuntos imutáveis ​​e mantém os elementos em ordem classificada.

Declarando Variáveis ​​TreeSet

A seguir está a sintaxe para declarar uma variável TreeSet.

Sintaxe

var z : TreeSet[String] = TreeSet("Zara","Nuha","Ayan")

Aqui, z é declarado como um conjunto em árvore de Strings que possui três membros. Os valores podem ser adicionados usando comandos como os seguintes -

Comando

var myList1: TreeSet[String] = myList + "Naira";

Processando TreeSet

Abaixo está um programa de exemplo mostrando como criar, inicializar e processar TreeSet -

Exemplo

import scala.collection.immutable.TreeSet

object Demo {
   def main(args: Array[String]) = {
      var mySet: TreeSet[String] = TreeSet("Zara","Nuha","Ayan");
      // Add an element
      var mySet1: TreeSet[String] = mySet + "Naira";
      // Remove an element
      var mySet2: TreeSet[String] = mySet - "Nuha";
      // Create empty set
      var mySet3: TreeSet[String] = TreeSet.empty[String];
      println(mySet);
      println(mySet1);
      println(mySet2);
      println(mySet3);	  
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

TreeSet(Ayan, Nuha, Zara)
TreeSet(Ayan, Naira, Nuha, Zara)
TreeSet(Ayan, Zara)
TreeSet()

O mapa Scala é uma coleção de pares de chave / valor. Qualquer valor pode ser recuperado com base em sua chave. As chaves são exclusivas no mapa, mas os valores não precisam ser exclusivos. Os mapas também são chamados de tabelas Hash. Existem dois tipos de mapas, oimmutable e a mutable. A diferença entre objetos mutáveis ​​e imutáveis ​​é que quando um objeto é imutável, o próprio objeto não pode ser alterado.

Por padrão, Scala usa o mapa imutável. Se você quiser usar o mapa mutável, você terá que importarscala.collection.mutable.Mapclasse explicitamente. Se você deseja usar mapas mutáveis ​​e imutáveis ​​no mesmo, então você pode continuar a se referir ao mapa imutável comoMap mas você pode se referir ao conjunto mutável como mutable.Map.

A seguir estão as instruções de exemplo para declarar mapas imutáveis ​​-

// Empty hash table whose keys are strings and values are integers:
var A:Map[Char,Int] = Map()

// A map with keys and values.
val colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF")

Ao definir o mapa vazio, a anotação de tipo é necessária, pois o sistema precisa atribuir um tipo concreto à variável. Se quisermos adicionar um par de valores-chave a um Mapa, podemos usar o operador + como segue.

A + = ('I' -> 1)
A + = ('J' -> 5)
A + = ('K' -> 10)
A + = ('L' -> 100)

Operações básicas no MAP

Todas as operações em mapas podem ser expressas em termos dos três métodos a seguir.

Sr. Não Métodos e Descrição
1

keys

Este método retorna um iterável contendo cada chave no mapa.

2

values

Este método retorna um iterável contendo cada valor no mapa.

3

isEmpty

Este método retorna verdadeiro se o mapa estiver vazio, caso contrário, é falso.

Experimente o programa de exemplo a seguir, mostrando o uso dos métodos Map.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val colors = Map(
         "red" -> "#FF0000", "azure" -> "#F0FFFF", "peru" -> "#CD853F"
      )
      val nums: Map[Int, Int] = Map()
      println( "Keys in colors : " + colors.keys )
      println( "Values in colors : " + colors.values )
      println( "Check if colors is empty : " + colors.isEmpty )
      println( "Check if nums is empty : " + nums.isEmpty )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Keys in colors : Set(red, azure, peru)
Values in colors : MapLike(#FF0000, #F0FFFF, #CD853F)
Check if colors is empty : false
Check if nums is empty : true

Mapas de Concatenação

Você pode usar qualquer ++ operador ou Map.++() método para concatenar dois ou mais mapas, mas ao adicionar mapas removerá chaves duplicadas.

Experimente o programa de exemplo a seguir para concatenar dois mapas.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val colors1 = Map(
         "red" -> "#FF0000", "azure" -> "#F0FFFF", "peru" -> "#CD853F"
      )
      val colors2 = Map(
         "blue" -> "#0033FF", "yellow" -> "#FFFF00", "red" -> "#FF0000"
      )
      // use two or more Maps with ++ as operator
      var colors = colors1 ++ colors2
      println( "colors1 ++ colors2 : " + colors )
      // use two maps with ++ as method
      colors = colors1.++(colors2)
      println( "colors1.++(colors2)) : " + colors )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

colors1 ++ colors2 : Map(blue -> #0033FF, azure -> #F0FFFF, 
   peru -> #CD853F, yellow -> #FFFF00, red -> #FF0000)

colors1.++(colors2)) : Map(blue -> #0033FF, azure -> #F0FFFF, 
   peru -> #CD853F, yellow -> #FFFF00, red -> #FF0000)

Imprimir chaves e valores de um mapa

Você pode iterar pelas chaves e valores de um mapa usando o loop "foreach". Aqui, usamos o métodoforeachassociado ao iterador para percorrer as chaves. A seguir está o programa de exemplo.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val colors = Map("red" -> "#FF0000", "azure" -> "#F0FFFF","peru" -> "#CD853F")

      colors.keys.foreach{
         i =>  
         print( "Key = " + i )
         println(" Value = " + colors(i) )
      }
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Key = red Value = #FF0000
Key = azure Value = #F0FFFF
Key = peru Value = #CD853F

Verifique se há uma chave no mapa

Você pode usar qualquer Map.containsmétodo para testar se uma determinada chave existe ou não no mapa. Experimente o programa de exemplo a seguir para verificação de chave.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val colors = Map(
         "red" -> "#FF0000", "azure" -> "#F0FFFF", "peru" -> "#CD853F"
      )
      if( colors.contains( "red" )) {
         println("Red key exists with value :"  + colors("red"))
      } else {
         println("Red key does not exist")
      }
      if( colors.contains( "maroon" )) {
         println("Maroon key exists with value :"  + colors("maroon"))
      } else {
         println("Maroon key does not exist")
      }
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Red key exists with value :#FF0000
Maroon key does not exist

O mapa Scala é uma coleção de pares de chave / valor. Qualquer valor pode ser recuperado com base em sua chave. As chaves são exclusivas no mapa, mas os valores não precisam ser exclusivos. HashMap implementa mapa imutável e usa tabela hash para implementar o mesmo.

Declarando Variáveis ​​HashMap

A seguir está a sintaxe para declarar uma variável HashMap.

Sintaxe

val colors = HashMap("red" -> "#FF0000", "azure" -> "#F0FFFF", "peru" -> "#CD853F")

Aqui, as cores são declaradas como um mapa hash de Strings, Int, que tem três pares de valores-chave. Os valores podem ser adicionados usando comandos como os seguintes -

Comando

var myMap1: HashMap[Char, Int] = colors + ("black" -> "#000000");

Processando HashMap

Abaixo está um exemplo de programa mostrando como criar, inicializar e processar HashMap -

Exemplo

import scala.collection.immutable.HashMap
object Demo {
   def main(args: Array[String]) = {
      var myMap: HashMap[String,String] = HashMap(
         "red" -> "#FF0000", "azure" -> "#F0FFFF", "peru" -> "#CD853F"
      );
      // Add an element
      var myMap1: HashMap[String,String] = myMap + ("white" -> "#FFFFFF");
      // Print key values
      myMap.keys.foreach{ 
         i =>  
         print( "Key = " + i )
         println(" Value = " + myMap(i) )
      }
      if( myMap.contains( "red" )) {
         println("Red key exists with value :"  + myMap("red"))
      } else {
         println("Red key does not exist")
      }
      if( myMap.contains( "maroon" )) {
         println("Maroon key exists with value :"  + myMap("maroon"))
      } else {
         println("Maroon key does not exist")
      }
      //removing element
      var myMap2: HashMap[String,String] = myMap - ("white");
      // Create empty map
      var myMap3: HashMap[String,String] = HashMap.empty[String, String];
      println(myMap1);
      println(myMap2);
      println(myMap3);		  
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Key = azure Value = #F0FFFF
Key = peru Value = #CD853F
Key = red Value = #FF0000
Red key exists with value :#FF0000
Maroon key does not exist
HashMap(azure -> #F0FFFF, peru -> #CD853F, white -> #FFFFFF, red -> #FF0000)
HashMap(azure -> #F0FFFF, peru -> #CD853F, red -> #FF0000)
HashMap()

O mapa Scala é uma coleção de pares de chave / valor. Qualquer valor pode ser recuperado com base em sua chave. As chaves são exclusivas no mapa, mas os valores não precisam ser exclusivos. ListMap implementa mapa imutável e usa lista para implementar o mesmo. É usado com pequeno número de elementos.

Declarando Variáveis ​​ListMap

A seguir está a sintaxe para declarar uma variável ListMap.

Sintaxe

val colors = ListMap("red" -> "#FF0000", "azure" -> "#F0FFFF", "peru" -> "#CD853F")

Aqui, as cores são declaradas como um mapa hash de Strings, Int, que tem três pares de valores-chave. Os valores podem ser adicionados usando comandos como os seguintes -

Comando

var myMap1: ListMap[Char, Int] = colors + ("black" -> "#000000");

Processando ListMap

Abaixo está um exemplo de programa mostrando como criar, inicializar e processar ListMap -

Exemplo

import scala.collection.immutable.ListMap

object Demo {
   def main(args: Array[String]) = {
      var myMap: ListMap[String,String] = ListMap(
         "red" -> "#FF0000", "azure" -> "#F0FFFF", "peru" -> "#CD853F"
      );
      // Add an element
      var myMap1: ListMap[String,String] = myMap + ("white" -> "#FFFFFF");
      // Print key values
      myMap.keys.foreach{ 
         i =>  
         print( "Key = " + i )
         println(" Value = " + myMap(i) ) 
      }
      if( myMap.contains( "red" )) {
         println("Red key exists with value :"  + myMap("red"))
      } else {
         println("Red key does not exist")
      }
      if( myMap.contains( "maroon" )) {
         println("Maroon key exists with value :"  + myMap("maroon"))
      } else {
         println("Maroon key does not exist")
      }
      //removing element
      var myMap2: ListMap[String,String] = myMap - ("white");
      // Create empty map
      var myMap3: ListMap[String,String] = ListMap.empty[String, String];
      println(myMap1);
      println(myMap2);	
      println(myMap3);		  
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Key = red Value = #FF0000
Key = azure Value = #F0FFFF
Key = peru Value = #CD853F
Red key exists with value :#FF0000
Maroon key does not exist
ListMap(red -> #FF0000, azure -> #F0FFFF, peru -> #CD853F, white -> #FFFFFF)
ListMap(red -> #FF0000, azure -> #F0FFFF, peru -> #CD853F)
ListMap()

Um iterador não é uma coleção, mas sim uma maneira de acessar os elementos de uma coleção um por um. As duas operações básicas em umiterator it está next e hasNext. Uma chamada parait.next()retornará o próximo elemento do iterador e avançará o estado do iterador. Você pode descobrir se há mais elementos para retornar usando o Iteratorit.hasNext método.

A maneira mais direta de "percorrer" todos os elementos retornados por um iterador é usar um loop while. Vamos seguir o seguinte programa de exemplo.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val it = Iterator("a", "number", "of", "words")
      while (it.hasNext){
         println(it.next())
      }
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

a
number
of
words

Encontre o elemento de valor mínimo e máximo

Você pode usar it.min e it.maxmétodos para descobrir os elementos de valor mínimo e máximo de um iterador. Aqui, usamosita e itbpara executar duas operações diferentes porque o iterador pode ser percorrido apenas uma vez. A seguir está o programa de exemplo.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val ita = Iterator(20,40,2,50,69, 90)
      val itb = Iterator(20,40,2,50,69, 90)
      println("Maximum valued element " + ita.max )
      println("Minimum valued element " + itb.min )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Maximum valued element 90
Minimum valued element 2

Encontre o comprimento do iterador

Você pode usar qualquer it.size ou it.lengthmétodos para descobrir o número de elementos disponíveis em um iterador. Aqui, usamos ita e itb para realizar duas operações diferentes porque o iterador pode ser percorrido apenas uma vez. A seguir está o programa de exemplo.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val ita = Iterator(20,40,2,50,69, 90)
      val itb = Iterator(20,40,2,50,69, 90)
      println("Value of ita.size : " + ita.size )
      println("Value of itb.length : " + itb.length )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Value of ita.size : 6
Value of itb.length : 6

Scala Option [T] é um contêiner para zero ou um elemento de um determinado tipo. Uma opção [T] pode serSome[T] ou Noneobjeto, que representa um valor ausente. Por exemplo, o método get do Mapa de Scala produz Some (valor) se um valor correspondente a uma determinada chave for encontrado, ouNone se a chave fornecida não estiver definida no mapa.

O tipo de opção é usado freqüentemente em programas Scala e você pode comparar isso com o nullvalor disponível em Java que não indica nenhum valor. Por exemplo, o método get de java.util.HashMap retorna um valor armazenado no HashMap ou nulo se nenhum valor foi encontrado.

Digamos que temos um método que recupera um registro do banco de dados com base em uma chave primária.

def findPerson(key: Int): Option[Person]

O método retornará Some [Person] se o registro for encontrado, mas None se o registro não for encontrado. Vamos seguir o seguinte programa.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
      println("capitals.get( \"France\" ) : " +  capitals.get( "France" ))
      println("capitals.get( \"India\" ) : " +  capitals.get( "India" ))
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

capitals.get( "France" ) : Some(Paris)
capitals.get( "India" ) : None

A maneira mais comum de separar valores opcionais é por meio de uma correspondência de padrão. Por exemplo, tente o seguinte programa.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val capitals = Map("France" -> "Paris", "Japan" -> "Tokyo")
      println("show(capitals.get( \"Japan\")) : " + show(capitals.get( "Japan")) )
      println("show(capitals.get( \"India\")) : " + show(capitals.get( "India")) )
   }
   def show(x: Option[String]) = x match {
      case Some(s) => s
      case None => "?"
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

show(capitals.get( "Japan")) : Tokyo
show(capitals.get( "India")) : ?

Usando o método getOrElse ()

A seguir está o programa de exemplo para mostrar como usar o método getOrElse () para acessar um valor ou um padrão quando nenhum valor está presente.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val a:Option[Int] = Some(5)
      val b:Option[Int] = None 
      println("a.getOrElse(0): " + a.getOrElse(0) )
      println("b.getOrElse(10): " + b.getOrElse(10) )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

a.getOrElse(0): 5
b.getOrElse(10): 10

Usando o método isEmpty ()

A seguir está o programa de exemplo para mostrar como usar o método isEmpty () para verificar se a opção é None ou não.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val a:Option[Int] = Some(5)
      val b:Option[Int] = None 
      println("a.isEmpty: " + a.isEmpty )
      println("b.isEmpty: " + b.isEmpty )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Exemplo

a.isEmpty: false
b.isEmpty: true

A fila é o primeiro a entrar, primeiro a sair, estrutura de dados FIFO e permite inserir e recuperar elementos no modo FIFO.

Declaração de variáveis ​​de fila

A seguir está a sintaxe para declarar uma variável Queue.

Sintaxe

val queue = Queue(1, 2, 3, 4, 5)

Aqui, a fila é declarada como uma fila de números. O valor pode ser adicionado na frente usando comandos como o seguinte -

Comando

queue.enqueue(6)

O valor pode ser recuperado na frente usando comandos como o seguinte -

Comando

queue.dequeue()

Fila de Processamento

Abaixo está um programa de exemplo mostrando como criar, inicializar e processar a fila -

Exemplo

import scala.collection.mutable.Queue
object Demo {
   def main(args: Array[String]) = {
      var queue = Queue(1, 2, 3, 4, 5);
      // Print queue elements
      queue.foreach{(element:Int) => print(element + " ")}
      println();
      // Print first element
      println("First Element: " + queue.front)
      // Add an element
      queue.enqueue(6);
      // Print queue elements
      queue.foreach{(element:Int) => print(element+ " ")}
      println();
      // Remove an element
      var dq = queue.dequeue;
      // Print dequeued element
      println("Dequeued Element: " + dq)
      // Print queue elements
      queue.foreach{(element:Int) => print(element+ " ")}
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

1 2 3 4 5
First Element: 1
1 2 3 4 5 6
Dequeued Element: 1
2 3 4 5 6

A tupla do Scala combina um número fixo de itens para que possam ser passados ​​como um todo. Ao contrário de uma matriz ou lista, uma tupla pode conter objetos com diferentes tipos, mas também são imutáveis.

A seguir está um exemplo de uma tupla contendo um inteiro, uma string e o console.

val t = (1, "hello", Console)

Qual é o açúcar sintático (atalho) para o seguinte -

val t = new Tuple3(1, "hello", Console)

O tipo real de uma tupla depende do número e dos elementos que ela contém e dos tipos desses elementos. Assim, o tipo de (99, "Luftballons") é Tuple2 [Int, String]. O tipo de ('u', 'r', "o", 1, 4, "eu") é Tupla6 [Car, Car, String, Int, Int, String]

As tuplas são do tipo Tupla1, Tupla2, Tupla3 e assim por diante. Atualmente, há um limite máximo de 22 no Scala, se você precisar de mais, então pode usar uma coleção, não uma tupla. Para cada tipo TupleN, onde 1 <= N <= 22, Scala define vários métodos de acesso a elementos. Dada a seguinte definição -

val t = (4,3,2,1)

Para acessar os elementos de uma tupla t, você pode usar o método t._1 para acessar o primeiro elemento, t._2 para acessar o segundo e assim por diante. Por exemplo, a seguinte expressão calcula a soma de todos os elementos de t.

val sum = t._1 + t._2 + t._3 + t._4

Você pode usar Tupla para escrever um método que recebe uma Lista [Duplo] e retorna a contagem, a soma e a soma dos quadrados retornados em uma Tupla de três elementos, uma Tupla3 [Int, Duplo, Duplo]. Eles também são úteis para passar uma lista de valores de dados como mensagens entre atores na programação simultânea.

Experimente o seguinte programa de exemplo. Mostra como usar uma tupla.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val t = (4,3,2,1)
      val sum = t._1 + t._2 + t._3 + t._4
      println( "Sum of elements: "  + sum )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comandos

\>scalac Demo.scala
\>scala Demo

Resultado

Sum of elements: 10

Iterar sobre a tupla

Você pode usar Tuple.productIterator() método para iterar sobre todos os elementos de uma tupla.

Experimente o programa de exemplo a seguir para iterar nas tuplas.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val t = (4,3,2,1)
      t.productIterator.foreach{ i =>println("Value = " + i )}
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comandos

\>scalac Demo.scala
\>scala Demo

Resultado

Value = 4
Value = 3
Value = 2
Value = 1

Convertendo para String

Você pode usar Tuple.toString()método para concatenar todos os elementos da tupla em uma string. Experimente o programa de exemplo a seguir para converter em String.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val t = new Tuple3(1, "hello", Console)
      println("Concatenated String: " + t.toString() )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Concatenated String: (1,hello,scala.Console$@281acd47)

Troque os elementos

Você pode usar Tuple.swap método para trocar os elementos de um Tuple2.

Experimente o programa de exemplo a seguir para trocar os elementos.

Exemplo

object Demo {
   def main(args: Array[String]) {
      val t = new Tuple2("Scala", "hello")
      println("Swapped Tuple: " + t.swap )
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Swapped tuple: (hello,Scala)

Scala Seq é um traço para representar sequências imutáveis. Essa estrutura fornece acesso baseado em índice e vários métodos utilitários para localizar elementos, suas ocorrências e subsequências. Um Seq mantém o pedido de inserção.

Declarando Variáveis ​​Seq

A seguir está a sintaxe para declarar uma variável Seq.

Sintaxe

val seq: Seq[Int] = Seq(1, 2, 3, 4, 5)

Aqui, seq é declarado como um Seq de números. Seq fornece comandos como o seguinte -

Comando

val isPresent = seq.contains(4);
val contains = seq.endsWith(Seq(4,5));
var lastIndexOf = seq.lasIndexOf(5);

Processando Seq

Abaixo está um exemplo de programa mostrando como criar, inicializar e processar Seq -

Exemplo

import scala.collection.immutable.Seq
object Demo {
   def main(args: Array[String]) = {
      var seq = Seq(1, 2, 3, 4, 5, 3)
      // Print seq elements
      seq.foreach{(element:Int) => print(element + " ")}
      println()
      println("Seq ends with (5,3): " + seq.endsWith(Seq(5, 3)))
      println("Seq contains 4: " + seq.contains(4))
      println("Last index of 3: " + seq.lastIndexOf(3))
      println("Reversed Seq" + seq.reverse)           
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

1 2 3 4 5 3
Seq ends with (5,3): true
Seq contains 4: true
Last index of 3: 5
Reversed SeqList(3, 5, 4, 3, 2, 1)

Stack é o último a entrar, primeiro a sair, estrutura de dados LIFO e permite inserir e recuperar o elemento no topo, de maneira LIFO.

Declaração de variáveis ​​de pilha

A seguir está a sintaxe para declarar uma variável Stack.

Sintaxe

val stack = Stack(1, 2, 3, 4, 5)

Aqui, a pilha é declarada como uma pilha de números. O valor pode ser adicionado no topo usando comandos como os seguintes -

Comando

stack.push(6)

O valor pode ser recuperado de cima usando comandos como o seguinte -

Comando

stack.top

O valor pode ser removido do topo usando comandos como o seguinte -

Comando

stack.pop

Pilha de Processamento

Abaixo está um programa de exemplo mostrando como criar, inicializar e processar Stack -

Exemplo

import scala.collection.mutable.Stack
object Demo {
   def main(args: Array[String]) = {
      var stack: Stack[Int] = Stack();
      // Add elements
      stack.push(1);
      stack.push(2);
      // Print element at top
      println("Top Element: " + stack.top)
      // Print element
      println("Removed Element: " + stack.pop())
      // Print element
      println("Top Element: " + stack.top)	
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Top Element: 2
Removed Element: 2
Top Element: 1

Scala Stream é uma lista especial com recurso de avaliação lenta. No fluxo do scala, os elementos são avaliados apenas quando são necessários. O Stream oferece suporte à computação lenta e ao desempenho.

Declaração de variáveis ​​de fluxo

A seguir está a sintaxe para declarar uma variável Stream.

Sintaxe

val stream = 1 #:: 2 #:: 3 #:: Stream.empty

Aqui, stream é declarado como um stream de números. Aqui, 1 é a cauda do rio, 2, 3 são a cauda do rio. Stream.empty marca o fim do fluxo. Os valores podem ser recuperados usando comandos take como os seguintes -

Comando

stream.take(2)

Stream de processamento

Abaixo está um programa de exemplo mostrando como criar, inicializar e processar Stream -

Exemplo

import scala.collection.immutable.Stream
object Demo {
   def main(args: Array[String]) = {
      val stream = 1 #:: 2 #:: 3 #:: Stream.empty
      // print stream
      println(stream)
      // Print first two elements	
      stream.take(2).print
      println()
      // Create an empty stream
      val stream1: Stream[Int] = Stream.empty[Int]
      // Print element
      println(s"Stream: $stream1")
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Stream(1, <not computed>)
1, 2
Stream: Stream()

O método drop () é o método usado por List para selecionar todos os elementos, exceto os primeiros n elementos da lista.

Sintaxe

A seguir está a sintaxe do método drop.

def drop(n: Int): List[A]

Aqui, n é o número de elementos a serem eliminados da lista. Este método retorna todos os elementos da lista, exceto os primeiros n.

Uso

Abaixo está um exemplo de programa mostrando como usar o método drop -

Exemplo

object Demo {
   def main(args: Array[String]) = {
      val list = List(1, 2, 3, 4, 5)
      // print list
      println(list)
      //apply operation
      val result = list.drop(3)
      //print result
      println(result)      
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

List(1, 2, 3, 4, 5)
List(4, 5)

O método dropWhile () é usado por List para eliminar todos os elementos que satisfaçam uma determinada condição.

Sintaxe

A seguir está a sintaxe do método dropWhile.

def dropWhile(p: (A) => Boolean): List[A]

Aqui, p: (A) => Booleano é um predicado ou condição a ser aplicada em cada elemento da lista. Este método retorna todos os elementos da lista, exceto os eliminados.

Uso

Abaixo está um programa de exemplo mostrando como usar o método dropWhile -

Exemplo

object Demo {
   def main(args: Array[String]) = {
      val list = List(3, 6, 9, 4, 2)
      // print list
      println(list)
      //apply operation
      val result = list.dropWhile(x=>{x % 3 == 0})
      //print result
      println(result)      
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

List(3, 6, 9, 4, 2)
List(4, 2)

O método filter () é usado por List para selecionar todos os elementos que satisfaçam um determinado predicado.

Sintaxe

A seguir está a sintaxe do método de filtro.

def filter(p: (A) => Boolean): List[A]

Aqui, p: (A) => Booleano é um predicado ou condição a ser aplicada em cada elemento da lista. Este método retorna todos os elementos da lista que satisfazem a condição dada.

Uso

Abaixo está um programa de exemplo mostrando como usar o método de filtro -

Exemplo

object Demo {
   def main(args: Array[String]) = {
      val list = List(3, 6, 9, 4, 2)
      // print list
      println(list)
      //apply operation
      val result = list.filter(x=>{x % 3 == 0})
      //print result
      println(result)      
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

List(3, 6, 9, 4, 2)
List(3, 6, 9)

O método find () é o método usado pelos Iteradores para encontrar um elemento que satisfaça um determinado predicado.

Sintaxe

A seguir está a sintaxe do método find.

def find(p: (A) => Boolean): Option[A]

Aqui, p: (A) => Boolean é um predicado ou condição a ser aplicado em cada elemento do iterador. Este método retorna o elemento Option contendo o elemento correspondente do iterador que satisfaz a condição fornecida.

Uso

Abaixo está um programa de exemplo mostrando como usar o método de localização -

Exemplo

object Demo {
   def main(args: Array[String]) = {
      val iterator = Iterator(3, 6, 9, 4, 2)
      //apply operation
      val result = iterator.find(x=>{x % 3 == 0})
      //print result
      println(result)      
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

Some(3)

O método flatMap () é o método do traço TraversableLike, ele pega um predicado, aplica-o a cada elemento da coleção e retorna uma nova coleção de elementos retornados pelo predicado.

Sintaxe

A seguir está a sintaxe do método flatMap.

def flatMap[B](f: (A) ? GenTraversableOnce[B]): TraversableOnce[B]

Aqui, f: (A)? GenTraversableOnce [B] é um predicado ou condição a ser aplicada em cada elemento da coleção. Este método retorna o elemento Option contendo o elemento correspondente do iterador que satisfaz a condição fornecida.

Uso

Abaixo está um exemplo de programa mostrando como usar o método flatMap -

Exemplo

object Demo {
   def main(args: Array[String]) = {
      val list = List(1, 5, 10)
      //apply operation
      val result = list.flatMap{x => List(x,x+1)}
      //print result
      println(result)      
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

List(1, 2, 5, 6, 10, 11)

O método flatten () é um membro GenericTraversableTemplate traço, ele retorna uma única coleção de elementos mesclando coleções filho.

Sintaxe

A seguir está a sintaxe do método flatten.

def flatten[B]: Traversable[B]

Aqui, f: (A)? GenTraversableOnce [B] é um predicado ou condição a ser aplicada em cada elemento da coleção. Este método retorna o elemento Option contendo o elemento correspondente do iterador que satisfaz a condição fornecida.

Uso

Abaixo está um programa de exemplo mostrando como usar o método nivelar -

Exemplo

object Demo {
   def main(args: Array[String]) = {
      val list = List(List(1,2), List(3,4))
      //apply operation
      val result = list.flatten
      //print result
      println(result)      
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

List(1, 2, 3, 4)

O método fold () é um membro do traço TraversableOnce, é usado para recolher elementos de coleções.

Sintaxe

A seguir está a sintaxe do método fold.

def fold[A1 >: A](z: A1)(op: (A1, A1) ? A1): A1

Aqui, o método fold leva a função do operador binário associativo como parâmetro. Este método retorna o resultado como valor. Ele considera a primeira entrada como valor inicial e a segunda entrada como uma função (que leva o valor acumulado e o item atual como entrada).

Uso

Abaixo está um exemplo de programa mostrando como usar o método de dobra -

Exemplo

object Demo {
   def main(args: Array[String]) = {
      val list = List(1, 2, 3 ,4)
      //apply operation to get sum of all elements of the list
      val result = list.fold(0)(_ + _)
      //print result
      println(result)      
   }
}

Aqui, passamos 0 como valor inicial para a função de dobra e, em seguida, todos os valores são adicionados. Salve o programa acima emDemo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

10

O método foldLeft () é um membro do traço TraversableOnce, é usado para recolher elementos de coleções. Ele navega pelos elementos da ordem da esquerda para a direita. É usado principalmente em funções recursivas e evita exceções de estouro de pilha.

Sintaxe

A seguir está a sintaxe do método fold.

def foldLeft[B](z: B)(op: (B, A) ? B): B

Aqui, o método foldLeft usa a função de operador binário associativo como parâmetro. Este método retorna o resultado como valor.

Uso

Abaixo está um programa de exemplo mostrando como usar o método foldLeft -

Exemplo

object Demo {
   def main(args: Array[String]) = {
      val list = List(1, 2, 3 ,4)
      //apply operation to get sum of all elements of the list
      val result = list.foldLeft(0)(_ + _)
      //print result
      println(result)      
   }
}

Aqui, passamos 0 como valor inicial para a função de dobra e, em seguida, todos os valores são adicionados. Salve o programa acima emDemo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

10

O método foldRight () é um membro do traço TraversableOnce, é usado para recolher elementos de coleções. Ele navega pelos elementos da ordem da direita para a esquerda.

Sintaxe

A seguir está a sintaxe do método foldRight.

def foldRight[B](z: B)(op: (B, A) ? B): B

Aqui, o método fold leva a função do operador binário associativo como parâmetro. Este método retorna o valor resultante.

Uso

Abaixo está um exemplo de programa mostrando como usar o método foldRight -

Exemplo

object Demo {
   def main(args: Array[String]) = {
      val list = List(1, 2, 3 ,4)
      //apply operation to get sum of all elements of the list
      val result = list.foldRight(0)(_ + _)
      //print result
      println(result)      
   }
}

Aqui, passamos 0 como valor inicial para a função foldRight e todos os valores são adicionados. Salve o programa acima emDemo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

10

O método map () é um membro do traço TraversableLike, é usado para executar um método de predicado em cada elemento de uma coleção. Ele retorna uma nova coleção.

Sintaxe

A seguir está a sintaxe do método map.

def map[B](f: (A) ? B): Traversable[B]

Aqui, o método do mapa usa uma função pré-mediada como parâmetro. Este método retorna a coleção atualizada.

Uso

Abaixo está um exemplo de programa mostrando como usar o método de mapa -

Exemplo

object Demo {
   def main(args: Array[String]) = {
      val list = List(1, 2, 3 ,4)
      //apply operation to get twice of each element.
      val result = list.map(_ * 2)
      //print result
      println(result)      
   }
}

Salve o programa acima em Demo.scala. Os seguintes comandos são usados ​​para compilar e executar este programa.

Comando

\>scalac Demo.scala
\>scala Demo

Resultado

List(2, 4, 6, 8)

O método partition () é um membro do traço TraversableLike, ele é usado para executar um método predicado em cada elemento de uma coleção. Ele retorna duas coleções, uma coleção é de elementos que satisfazem uma determinada função de predicado e outra coleção é de elementos que não satisfazem a função de predicado fornecida.

Sintaxe

A seguir está a sintaxe do método map.

def partition(p: (A) ? Boolean): (Repr, Repr)

Here, partition method takes a prediate function as a parameter. This method returns the collections.

Usage

Below is an example program of showing how to use partition method −

Example

object Demo {
   def main(args: Array[String]) = {
      val list = List(1, 2, 3, 4, 5, 6, 7)
      //apply operation to get twice of each element.
      val (result1, result2) = list.partition(x=>{x % 3 == 0})
      //print result
      println(result1)
      println(result2)      
   }
}

Save the above program in Demo.scala. The following commands are used to compile and execute this program.

Command

\>scalac Demo.scala
\>scala Demo

Output

List(3, 6)
List(1, 2, 4, 5, 7)

reduce() method is a member of TraversableOnce trait, it is used to collapse elements of collections. It is similar to fold method but it does not take initial value.

Syntax

The following is the syntax of reduce method.

def reduce[A1 >: A](op: (A1, A1) ? A1): A1

Here, reduce method takes associative binary operator function as a parameter. This method returns the resultant value.

Usage

Below is an example program of showing how to use fold method −

Example

object Demo {
   def main(args: Array[String]) = {
      val list = List(1, 2, 3 ,4)
      //apply operation to get sum of all elements of the list
      val result = list.reduce(_ + _)
      //print result
      println(result)      
   }
}

Save the above program in Demo.scala. The following commands are used to compile and execute this program.

Command

\>scalac Demo.scala
\>scala Demo

Output

10

scan() method is a member of TraversableLike trait, it is similar to fold method but is used to apply a operation on each elements of collection and return a collection.

Syntax

The following is the syntax of fold method.

def scan[B >: A, That](z: B)(op: (B, B) ? B)(implicit cbf: CanBuildFrom[Repr, B, That]): That

Here, scan method takes associative binary operator function as a parameter. This method returns the updated collection as result. It considers first input as initial value and second input as a function.

Usage

Below is an example program of showing how to use scan method −

Example

object Demo {
   def main(args: Array[String]) = {
      val list = List(1, 2, 3 ,4)
      //apply operation to create a running total of all elements of the list
      val list1 = list.scan(0)(_ + _)
      //print list
      println(list1)      
   }
}

Here we've passed 0 as initial value to scan function and then all values are added. Save the above program in Demo.scala. The following commands are used to compile and execute this program.

Command

\>scalac Demo.scala
\>scala Demo

Output

List(0, 1, 3, 6, 10)

zip() method is a member of IterableLike trait, it is used to merge a collection to current collection and result is a collection of pair of tuple elements from both collections.

Syntax

The following is the syntax of zip method.

def zip[B](that: GenIterable[B]): Iterable[(A, B)]

Here, zip method takes a collection as parameter. This method returns the updated collection of pair as result.

Usage

Below is an example program of showing how to use zip method −

Example

object Demo {
   def main(args: Array[String]) = {
      val list = List(1, 2, 3 ,4)
      val list1 = List("A", "B", "C", "D")
      //apply operation to create a zip of list
      val list2 = list zip list1
      //print list
      println(list2)      
   }
}

Save the above program in Demo.scala. The following commands are used to compile and execute this program.

Command

\>scalac Demo.scala
\>scala Demo

Output

List((1,A), (2,B), (3,C), (4,D))