Operador diamante no Java7 <>
13/agosto/2012 - Java
Olá,
Bom, já faz quase um ano que escrevi dois posts sobre java 7, um sobre arquivos e outro sobre switch e catch multiplos. Hoje o post é sobre o diamante <>, o operador.
O uso desse operador economiza alguns toques no teclado, brincadeira, na verdade elimina uma redundância na parametrização de tipos.
Antes era assim:
List<String> lista = new ArrayList<String>(); Map<Integer, Pessoa> map = new TreeMap<Integer, Pessoa>();
Agora pode ficar assim:
List<String> lista = new ArrayList<>(); Map<Integer, Pessoa> map = new TreeMap<>();
Vamos economizar digitação, mas não economize em usar o <>, é sempre bom por o <> para evitar alguns erros.
Veja que no exemplo abaixo que se omitimos o diamante o compilador não reclama, mas tem um erro conceitual pois queremos uma variável do tipo Map<Integer, String>
Map<Integer, Pessoa> map1 = new TreeMap<>(); map1.put(0, new PessoaFisica()); Map<Integer, String> outroMap = new TreeMap(map);
Com o uso do diamante o compilador não aceita a declaração:
Map<Integer, Pessoa> map1 = new TreeMap<>(); map1.put(0, new PessoaFisica()); Map<Integer, String> outroMap = new TreeMap<>(map);
Os exemplos abaixo também são aceitos, mas para mim o melhor mesmo é parametrizar o tipo correto.
List<?> list1 = new ArrayList<>(); List list2 = new ArrayList<>(); List<?> list3 = new ArrayList();
Se a List é declaração com ?, o compilador entende que é uma lista de Object.
É possivel usar extends e o super também.
Map<Integer, ? extends Pessoa > map4 = new TreeMap<>(); Map<Integer, ? super Pessoa > map5 = new TreeMap<>();
Nesse link tem um exemplo de teste do JDK
O Eclipse Juno já completa diretamente com <> com o uso de ctrl + espaço se tiver configurado para trabalhar com a sintaxe Java 7.
até mais,
Roberto
Trabalhando com arquivos no Java 7
30/agosto/2011 - Java
Olá
Trabalhar com arquivos no Java7 ficou muito mais fácil com a introdução da classe java.nio.file.Files. Com esta classe copiar, mover, apagar e outras operações básicas ficaram muito simples.
A seguir veremos alguns exemplos:
O trecho abaixo obtém o sistemas de arquivos padrão acessível pela JVM.
FileSystem defaultFS = FileSystems.getDefault();
Agora criamos um objeto da classe Path que representa o diretório D:\java
Path basePath = defaultFS.getPath("D:\\", "java");
Os objetos Path podem referenciar diretórios e arquivos.
Path temp1 = basePath.resolve("temp1"+ File.separator + "meu_arquivo.txt"); Path temp2 = basePath.resolve("temp2");
Usamos a classe Files para criar o diretório com o método estático createDirectories()
Files.createDirectories(temp2);
Abaixo copiamos o arquivo para outro diretório substituindo caso exista.
Files.copy(temp1, temp2, StandardCopyOption.REPLACE_EXISTING );
Para move o arquivo para outro diretório substituindo caso exista usamos o código abaixo.
Files.move(temp1, temp3.resolve("fim.txt"), StandardCopyOption.REPLACE_EXISTING);
Para saber se o arquivo existe
System.out.println("File exists " + Files.exists(temp1));
Mostramos o tamanho do arquivo em bytes
System.out.println(Files.size(temp2) + " bytes");
O código abaixo lista os diretórios raízes, no windows retornaria C:\, D:\, E:\ etc.
FileSystem defaultFS = FileSystems.getDefault(); Iterable<Path> rootDirectories = defaultFS.getRootDirectories(); for(Path pth : rootDirectories){ System.out.println(pth.toString()); }
Para mim a API foi bem escrita, é bem auto-explicativa.
Por enquanto minha ressalva é quanto as permissões no padrão POSIX, achei elas complicadas de serem aplicadas.
Antes de ter a classe Files para copiar um arquivo geralmente faríamos:
FileInputStream in = new FileInputStream("D:\arquivo.txt"); FileOutputStream out = new FileOutputStream("D:\destino.txt"); byte[] buf = new byte[1024]; int i = 0; while ((i = in.read(buf)) != -1) { out.write(buf, 0, i); } in.close(); out.close();
No Java 7 não precisa dar close nos recursos que implementam java.lang.AutoCloseable. Assim você não corre mais riscos de esquece preso um recurso.
Até mais,
Roberto
Java7 – Switch com String e multi-catch
21/agosto/2011 - Java
Olá,
Instalei o Java 7 para testar alguns novos recursos.
Link para download
Vamos aos dois mais básicos, porém muito úteis.
1. switch
Agora no Java 7 é possível fazer switch de Strings.
Como sempre, o comando é case-sensitive.
public class Java7 { public static void main(String [] args){ String cor = "azul"; switch(cor){ case "verde": System.out.println("Cor verde"); break; case "amarelo": System.out.println("Cor amarelo"); break; case "azul": System.out.println("Cor azul"); break; case "Azul": System.out.println("Cor Azul"); break; default: System.out.println("Cor indefinida"); break; } } }
Nesse exemplo a saída seria: Cor azul
2. catch múltiplos
Nessa versão é possível com uma única declaração de catch “pegar” várias exceções.
Basta separar as exceções por pipe “|”.
import java.io.*; public class Java7 { public static void main(String [] args){ try { FileInputStream fis = new FileInputStream("arquivo.txt"); DataInputStream dis = new DataInputStream(fis); BufferedReader br = new BufferedReader(new InputStreamReader(dis, "UTF-8")); String linha; while ((linha = br.readLine()) != null){ System.out.println (linha); } } catch(IOException | NullPointerException exc){ System.out.println("Deu erro " + exc); } } }
As exceções declaradas no catch não podem ser mãe e filha (subclasse).
Se por exemplo declarássemos:
catch(IOException | FileNotFoundException | UnsupportedEncodingException exc)
Teríamos o seguinte erro na compilação:
Java7.java:16: error: Alternatives in a multi-catch statement cannot be related by subclassing } catch(IOException | FileNotFoundException | UnsupportedEncodin gException exc){ ^ Alternative FileNotFoundException is a subclass of alternative IOException Java7.java:16: error: Alternatives in a multi-catch statement cannot be related by subclassing } catch(IOException | FileNotFoundException | UnsupportedEncodin gException exc){ ^ Alternative UnsupportedEncodingException is a subclass of alternative IOExcept ion 2 errors
até mais,