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
Share
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
Share
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,
Share