Nesta postagem, vamos discutir algumas perguntas importantes de entrevista sobre o Java SE 8 com respostas. Escreverei mais uma postagem para discutir as demais perguntas de entrevista sobre o Java SE 8.
Perguntas de entrevista sobre o Java 8
- Por que precisamos mudar para o Java novamente?
- Novos recursos do Java SE 8?
- Vantagens dos novos recursos do Java SE 8?
- O que é uma Expressão Lambda?
- Quais são as três partes de uma Expressão Lambda? Qual é o tipo de uma Expressão Lambda?
- O que é uma Interface Funcional? O que é uma Interface SAM?
- É possível definir nossa própria Interface Funcional? O que é @FunctionalInterface? Quais são as regras para definir uma Interface Funcional?
- A anotação @FunctionalInterface é obrigatória para definir uma Interface Funcional? Qual é o uso da anotação @FunctionalInterface? Por que precisamos de Interfaces Funcionais no Java?
- Quando devemos usar a API Stream do Java 8? Por que precisamos usar a API Stream do Java 8 em nossos projetos?
- Explique as diferenças entre a API de Coleções e a API Stream do Java.
- O que é Spliterator no Java SE 8? Diferenças entre Iterator e Spliterator no Java SE 8?
- O que é Optional no Java 8? Qual é a utilidade do Optional? Vantagens do Optional no Java 8?
- 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 o Java 8
Nesta seção, vamos responder cada pergunta da seção anterior com uma descrição detalhada. Se você precisar de mais informações e exemplos, por favor consulte as postagens anteriores do Java SE 8 disponíveis no JournalDEV.
Por que precisamos mudar para o Java novamente?
A Oracle Corporation introduziu muitos novos conceitos no Java SE 8 para trazer os seguintes benefícios:
- Para utilizar eficientemente os CPUs multi-core atuais
Recentemente, podemos observar mudanças drásticas no Hardware. Atualmente, todos os sistemas estão usando 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 como parte do Java SE 8 para aproveitar as vantagens da programação funcional.
Novos recursos do Java SE 8?
- Expressões Lambda
- Interfaces Funcionais
- API de Stream
- API de Data e Hora
- Métodos Padrão e Métodos Estáticos de Interfaces
- Spliterator
- Referências de Método e Construtor
- Aprimoramentos na API de Coleções
- Aprimoramentos nas Utilidades de Concorrência
- Aprimoramentos no Framework Fork/Join
- Iteração Interna
- Operações de Array Paralelo e Coleção Paralela
- Optional
- Annotations de Tipo e Annotations Repetíveis
- Reflexão de Parâmetro de Método
- Codificação e decodificação Base64
- Aprimoramentos IO e NIO2
- Mecanismo Nashorn JavaScript
- Aprimoramentos javac
- Mudanças na JVM
- Java 8 Compact Profiles: compact1,compact2,compact3
- JDBC 4.2
- JAXP 1.6
- Java DB 10.10
- Networking
- Mudanças de segurança
Vantagens das novas funcionalidades do Java SE 8?
Podemos obter os seguintes benefícios das novas funcionalidades do Java SE 8:
- Código mais conciso e legível
- Código mais reutilizável
- Código mais testável e mantido
- Código altamente concorrente e escalável
- Escrever código paralelo
- Escrever operações semelhantes a banco de dados
- Melhor desempenho de aplicações
- Código mais produtivo
O que é uma expressão Lambda?
A expressão lambda é uma função anônima que aceita um conjunto de parâmetros de entrada e retorna resultados. A 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 uma expressão lambda?
A Lambda Expression contains 3 parts:
- Lista de parâmetros
Uma expressão lambda pode conter zero ou um ou mais parâmetros. É opcional.- Operador de seta 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” é Boolean. 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 nenhum resultado. Portanto, seu tipo é “java.lang.Runnable” Interface Funcional.
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. Usamos 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.
- Utilizar 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 substituirmos o método da classe java.lang.Object como um método abstrato, isso não será considerado 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 usarmos na definição de uma Interface Funcional, o compilador Java forçará o uso de 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, isso significa que estamos usando Interfaces Funcionais.
Quando devemos usar a API Stream do Java 8? Por que precisamos usar a API Stream do Java 8 em nossos projetos?
Quando nosso projeto Java precisa realizar as seguintes operações, é melhor usar a API Stream do Java 8 para obter muitos benefícios:Java 8 Stream API para obter muitos benefícios:
- Quando queremos realizar operações semelhantes a um banco de dados. Por exemplo, quando 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 obter melhor desempenho.
Explique as diferenças entre a API Collection e a API Stream?
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 em Java SE 8? Diferenças entre Iterator e Spliterator em Java SE 8?
O Spliterator significa Splitable Iterator. Ele foi introduzido recentemente pela Oracle Corporation como parte do Java SE 8. Assim como o Iterator e o ListIterator, ele também é uma das interfaces 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 em Java 8? Qual é o uso do Optional? Vantagens do Optional em Java 8?
Optional: Optional é uma classe final introduzida como parte do Java SE 8. Ela é 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 nulos.
- É 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 anteriores ao 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 é uma nova funcionalidade no Java SE 8. Ela 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 Strings com valores como mostrado abaixo:
String str[] = { "Java 7", "Java 8", "Java 9" };
Aqui atribuímos alguns valores de String no lado direito, mas não definimos seu tipo. O compilador Java automaticamente infere seu tipo e cria um Array de Strings. Java 7: A Oracle Corporation introduziu o novo recurso “Operador Diamond” no Java SE 7 para evitar a definição desnecessária de tipos 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 muito este conceito de Inferência de Tipo no Java SE 8. Usamos este conceito para definir Expressões Lambda, Funções, Referências de Método, etc.
ToIntBiFunction<Integer,Integer> add = (a,b) -> a + b;
{
“error”: “Upstream error…”
}
Source:
https://www.digitalocean.com/community/tutorials/javase8-interview-questions-part1