Perguntas e Respostas da Entrevista Java SE 8 (Parte 1)

Neste post, vamos discutir algumas importantes Perguntas de Entrevista do Java SE 8 com Respostas. Escreverei mais um post para abordar as restantes Perguntas de Entrevista do Java SE 8.

Perguntas de Entrevista do Java 8

  1. Por que precisamos voltar para o Java?
  2. Novas funcionalidades do Java SE 8?
  3. Vantagens das novas funcionalidades do Java SE 8?
  4. O que é uma Expressão Lambda?
  5. Quais são as três partes de uma Expressão Lambda? Qual é o tipo de Expressão Lambda?
  6. O que é uma Interface Funcional? O que é uma Interface SAM?
  7. É possível definir nossa própria Interface Funcional? O que é @FunctionalInterface? Quais são as regras para definir uma Interface Funcional?
  8. A anotação @FunctionalInterface é obrigatória para definir uma Interface Funcional? Qual é o uso da anotação @FunctionalInterface? Por que precisamos de Interfaces Funcionais em Java?
  9. Quando usar o Java 8 Stream API? Por que precisamos usar o Java 8 Stream API em nossos projetos?
  10. Explique as diferenças entre a API de Coleções e a API de Streams?
  11. O que é Spliterator no Java SE 8? Quais são as diferenças entre Iterator e Spliterator no Java SE 8?
  12. O que é Optional no Java 8? Qual é a utilidade do Optional? Quais são as vantagens do Optional no Java 8?
  13. O que é Inferência de Tipo? A Inferência de Tipo está disponível em versões mais antigas como o Java 7 e anteriores, ou está disponível apenas no Java SE 8?

Perguntas e Respostas sobre Java 8

Nesta seção, abordaremos cada pergunta da seção anterior com uma descrição detalhada. Se precisar de mais informações e exemplos, consulte as postagens anteriores sobre o Java SE 8 disponíveis no JournalDEV.

Por que precisamos migrar para o Java novamente?

A Oracle Corporation introduziu muitos novos conceitos no Java SE 8 para proporcionar os seguintes benefícios:

  • Para Utilizar Eficientemente CPUs Multi-Core Atuais
    Recentemente, podemos observar mudanças drásticas no Hardware. Hoje em dia, todos os sistemas estão utilizando CPUs Multi-Core (2, 4, 8, 16-Core, etc.) para implantar e executar suas aplicações. Precisamos de novas Construções de Programação em Java para utilizar esses Processadores Multi-Core de forma eficiente e desenvolver aplicações Altamente Concorrentes e Altamente Escaláveis. – Para Utilizar Recursos de Programação Funcional
    A Oracle Corporation introduziu muitos conceitos de Programação Funcional (FP) como parte do Java SE 8 para aproveitar as vantagens do FP.

Novas Funcionalidades do Java SE 8?

  • Expressões Lambda
  • Interfaces Funcionais
  • API de Fluxo (Stream)
  • API de Data e Hora
  • Métodos e Métodos Estáticos Padrão de Interface
  • Divisor
  • Referências de Método e Construtor
  • Aprimoramentos na API de Coleções
  • Aprimoramentos em Utilitários de Concorrência
  • Aprimoramentos no Framework Fork/Join
  • Iteração Interna
  • Operações de Array Paralelo e Coleção Paralela
  • Opcional
  • Annotations de Tipo e Annotations Repetíveis
  • Reflexão de Parâmetro de Método
  • Codificação e Decodificação Base64
  • Aprimoramentos em IO e NIO2
  • Máquina Virtual JavaScript Nashorn
  • Aprimoramentos em javac
  • Alterações na JVM
  • Perfis Compactos do Java 8: compact1, compact2, compact3
  • JDBC 4.2
  • JAXP 1.6
  • Java DB 10.10
  • Rede
  • Alterações de Segurança

Vantagens dos Novos Recursos do Java SE 8?

Podemos obter os seguintes benefícios dos Novos Recursos do Java SE 8:

  • Código mais Conciso e Legível
  • Código mais Reutilizável
  • Código mais Testável e Mantível
  • Código Altamente Concorrente e Altamente Escalável
  • Escrever Código Paralelo
  • Realizar Operações semelhantes a Banco de Dados
  • Aplicações com Melhor Desempenho
  • Código mais Produtivo

O que é uma Expressão Lambda?

Expressão Lambda é uma função anônima que aceita um conjunto de parâmetros de entrada e retorna resultados. Expressão Lambda é um bloco de código sem nenhum nome, com ou sem parâmetros e com ou sem resultados. Este bloco de código é executado sob demanda.

Quais são as três partes de uma Expressão Lambda? Qual é o tipo de Expressão Lambda?

A Lambda Expression contains 3 parts:

  • Lista de Parâmetros
    Uma Expressão Lambda pode conter zero, um ou mais parâmetros. É opcional. – Operador de Setas Lambda
    “->” é conhecido como operador de seta Lambda. Ele separa a lista de parâmetros e o corpo. – Corpo da Expressão Lambda

O tipo de “Journal Dev” é java.lang.String. O tipo de “true” é Booleano. Da mesma forma, qual é o tipo de uma Expressão Lambda? O Tipo de uma Expressão Lambda é uma Interface Funcional. Exemplo:- Qual é o tipo da seguinte Expressão Lambda?

   () -> System.out.println("Hello World");

Esta Expressão Lambda não tem parâmetros e não retorna resultados. Portanto, seu tipo é a Interface Funcional “java.lang.Runnable”.

O que é uma Interface Funcional? O que é uma Interface SAM?

A Functional Interface is an interface, which contains one and only one abstract method. Functional Interface is also known as SAM Interface because it contains only one abstract method. SAM Interface stands for Single Abstract Method Interface. Java SE 8 API has defined many Functional Interfaces.

É possível definir nossa própria Interface Funcional? O que é @FunctionalInterface? Quais são as regras para definir uma Interface Funcional?

Sim, é possível definir nossas próprias Interfaces Funcionais. Utilizamos a anotação @FunctionalInterface do Java SE 8 para marcar uma interface como Interface Funcional. Precisamos seguir estas regras para definir uma Interface Funcional:

  • Definir uma interface com um e apenas um método abstrato.
  • Não podemos definir mais de um método abstrato.
  • Usar a anotação @FunctionalInterface na definição da interface.
  • Podemos definir qualquer número de outros métodos, como métodos padrão e métodos estáticos.
  • Se sobrescrevermos o método da classe java.lang.Object como um método abstrato, isso não conta como um método abstrato.

É obrigatória a anotação @FunctionalInterface para definir uma Interface Funcional? Qual é o uso da anotação @FunctionalInterface? Por que precisamos de Interfaces Funcionais em Java?

Não é obrigatório definir uma Interface Funcional com a anotação @FunctionalInterface. Se não quisermos, podemos omitir essa anotação. No entanto, se a utilizarmos na definição de uma Interface Funcional, o compilador Java nos obriga a ter um e apenas um método abstrato dentro dessa interface. Por que precisamos de Interfaces Funcionais? O tipo de uma Expressão Lambda do Java SE 8 é uma Interface Funcional. Sempre que usamos Expressões Lambda, estamos usando Interfaces Funcionais.

Quando devemos usar o Java 8 Stream API? Por que precisamos usar o Java 8 Stream API em nossos projetos?

Quando nosso projeto Java deseja realizar as seguintes operações, é melhor usar a API de Fluxo do Java 8 para obter muitos benefícios:

  • Quando queremos realizar operações semelhantes a bancos de dados. Por exemplo, queremos realizar operações de agrupamento, ordenação, etc.
  • Quando queremos realizar operações de forma preguiçosa.
  • Quando queremos escrever programação no estilo funcional.
  • Quando queremos realizar operações paralelas.
  • Quando queremos usar Iteração Interna.
  • Quando queremos realizar operações de encadeamento.
  • Quando queremos alcançar melhor desempenho.

Explique as diferenças entre a API de Coleções e a API de Fluxo?

S.No. Collection API Stream API
1. It’s available since Java 1.2 It is introduced in Java SE 8
2. It is used to store Data (A set of Objects). It is used to compute data (Computation on a set of Objects).
3. We can use both Spliterator and Iterator to iterate elements. We can use forEach to performs an action for each element of this stream. We can’t use Spliterator or Iterator to iterate elements.
4. It is used to store unlimited number of elements. Stream API is used to process on the elements of a Collection.
5. Typically, it uses External Iteration concept to iterate Elements such as Iterator. Stream API uses internal iteration to iterate Elements, using forEach methods.
6. Collection Object is constructed Eagerly. Stream Object is constructed Lazily.
7. We add elements to Collection object only after it is computed completely. We can add elements to Stream Object without any prior computation. That means Stream objects are computed on-demand.
8. We can iterate and consume elements from a Collection Object at any number of times. We can iterate and consume elements from a Stream Object only once.

O que é Spliterator no Java SE 8? Quais são as diferenças entre Iterator e Spliterator no Java SE 8?

O Spliterator significa Iterador Divisível. Ele foi introduzido recentemente pela Oracle Corporation como parte do Java SE 8. Assim como Iterator e ListIterator, ele também é uma interface do Iterator.

S.No. Spliterator Iterator
1. It is introduced in Java SE 8. It is available since Java 1.2.
2. Splitable Iterator Non-Splitable Iterator
3. It is used in Stream API. It is used for Collection API.
4. It uses Internal Iteration concept to iterate Streams. It uses External Iteration concept to iterate Collections.
5. We can use Spliterator to iterate Streams in Parallel and Sequential order. We can use Iterator to iterate Collections only in Sequential order.
6. We can get Spliterator by calling spliterator() method on Stream Object. We can get Iterator by calling iterator() method on Collection Object.
7. Important Method: tryAdvance() Important Methods: next(), hasNext()

O que é Optional no Java 8? Qual é o uso de Optional? Quais são as vantagens do Optional no Java 8?

Optional: Optional é uma classe final introduzida como parte do Java SE 8. Está definida no pacote java.util. É usada para representar valores opcionais que podem existir ou não. Pode conter um valor ou nenhum valor. Se contiver um valor, podemos obtê-lo. Caso contrário, não obtemos nada. É uma coleção limitada, ou seja, contém no máximo um elemento apenas. É uma alternativa ao valor “null”. A principal vantagem do Optional é:

  • É usado para evitar verificações de nulo.
  • É usado para evitar “NullPointerException”.

O que é Inferência de Tipo? A Inferência de Tipo está disponível em versões mais antigas como o Java 7 e antes do 7, ou está disponível apenas no Java SE 8?

A Inferência de Tipo significa determinar o tipo pelo compilador em tempo de compilação. Não é um recurso novo no Java SE 8. Está disponível no Java 7 e antes do Java 7 também. Antes do Java 7:- Vamos explorar arrays em Java. Defina um Array de String com valores conforme mostrado abaixo:

String str[] = { "Java 7", "Java 8", "Java 9" };

Aqui atribuímos alguns valores de String do lado direito, mas não definimos seu tipo. O compilador Java infere automaticamente seu tipo e cria um Array de String. Java 7: A Oracle Corporation introduziu o “Operador Diamond” como novo recurso no Java SE 7 para evitar definições de Tipo desnecessárias em Genéricos.

Map<String,List<Customer>> customerInfoByCity = new HashMap<>();

Aqui não definimos informações de Tipo no lado direito, simplesmente definimos o Operador Diamond do Java SE 7. Java SE 8: A Oracle Corporation aprimorou bastante esse conceito de Inferência de Tipo no Java SE 8. Usamos esse conceito para definir Expressões Lambda, Funções, Referências de Método, etc.

ToIntBiFunction<Integer,Integer> add = (a,b) -> a + b;

Aqui o compilador Java observa a definição de tipo disponível no lado esquerdo e determina o tipo dos parâmetros da Expressão Lambda a e b como Integers. Isso é tudo sobre Perguntas de Entrevista do Java 8. Eu discuti algumas Perguntas de Entrevista do Java SE 8 neste post e discutirei algumas mais em meus próximos posts. Por favor, deixe um comentário se você gostou do meu post ou tiver quaisquer problemas/sugestões.

Source:
https://www.digitalocean.com/community/tutorials/javase8-interview-questions-part1