16
Dec

Classes Java que você só ouviu falar - parte 1 - java.util.Scanner

A classe java.util.Scanner passou a fazer parte da gama de classes que acompanham uma instalação do Java a partir da versão 5.

Seu grande propósito é escanear texto e efetuar o parse em primitivos e strings baseando-se em expressões regulares para tal.

A seguir vemos um exemplo muito simples onde você pode observar a classe em funcionamento:


    Scanner sc = new Scanner(System.in);
    while(sc.hasNextInt()) {
      int i = sc.nextInt();
      System.out.println(i);  
    }


No exemplo apresentado, o loop continua executando até que você deixe de digitar números e digite algum outro tipo de caractere

Um outro exemplo muito interessante é o seguinte:


  public static void main(String[] args) throws Exception {

    Scanner sc = null;

    try {
      sc = new Scanner(new FileReader("Arquivo.txt")).useDelimiter(",");
      while (sc.hasNextInt()) {
        System.out.println("Int encontrado: " + sc.nextInt());
      }
    } finally {
      sc.close();
    }
  }


Nesse exemplo, o arquivo denominado Arquivo.txt deve conter o seguinte:


1,2,3,4,5,6,7,8

Caso o arquivo contenha a separação por vírgula com espaços, o exemplo já não funcionará.
É aí que a classe java.util.Scanner mostra seu poder. Se você especificar uma expressão regular corretamente, veremos que é possível se adequar a esse tipo de cenário e especificar algo como 1, 2,3,     4,5,6,7,8 no arquivo, ainda obtendo o comportamento esperado.

O exemplo a seguir mostra o código com a expressão regular que atende ao cenário apresentado:


  public static void main(String[] args) throws Exception {

    Scanner sc = null;

    try {
      sc = new Scanner(new FileReader("Arquivo.txt"))
        .useDelimiter("(\\s)*,(\\s)*");
      while (sc.hasNextInt()) {
        System.out.println("Int encontrado: " + sc.nextInt());
      }
    } finally {
      sc.close();
    }
  }


Apresentei aqui uma classe Java que você provavelmente ainda não conhecia ou se conhecia, dificilmente já tinha usado. Espero que tenha gostado!


free b2evolution skin
20
Jun

Scala: if que retorna valor

Vou escrever aqui sobre scala. Tenho estudado scala já há algum tempo e a linguagem tem algumas features muito interessantes.

A idéia é apresentar aqui um conceito da linguagem que parece estranho à primeira vista, mas que se torna extremamente útil e interessante à medida que entendemos seu propósito: na linguagem scala, podemos retornar valores a partir de um bloco if e valorizar uma variável ou valor com esse retorno.

O código a seguir ilustra esse conceito:


def main(args: Array[String]) {
   val valorPar = 
      if( (args(0).toInt % 2) == 0 ) {
	"Sim"
      } else {
	"Não"
      };

   println(valorPar);
}

Parece estranho, não? Mas não é...

Em Java, teríamos que criar uma variável externa e atribuí-la diretamente no if, o que torna o código mais complexo e maior. Vimos que essa construção em Scala, apesar de estranha à primeira vista, se mostra muito útil e robusta à medida que a entendemos melhor.


free b2evolution skin
26
May

Meu primeiro post: javax.time

Esse é meu primeiro post no blog, que estou inaugurando hoje, 27/05/2009. Espero poder compartilhar o que venho fazendo de interessante e ter tempo suficiente para escrever.

Vou falar aqui sobre o artigo que publiquei na JavaMagazine, edição 69, que deve estar chegando na casa dos assinantes e deve estar nas bancas em breve. O artigo aborda a nova API para representar datas e horas na plataforma Java. Essa nova API está sendo concebida através da JSR 310 e você pode participar do desenvolvimento acessando http://jsr-310.dev.java.net.

Tive o prazer de ter ao meu lado, como co-autor, um dos spec-leads da JSR 310, Michael Nascimento Santos. Clique aqui para acessar seu blog.

O artigo aborda tanto a arquitetura da nova API quanto seu propósito, além de ilustrar a maioria das classes e interfaces disponíveis.

Um dos principais pontos fortes da API é que ela possui como um de seus principais propósitos corrigir uma série de problemas presentes hoje nas classes java.util.Date e java.util.Calendar. Um exemplo disso é o fato da nova API possuir em todas as suas classes a capacidade de suportar múltiplas threads concorrentemente, o que não é suportado pelas opções atuais.

Além disso, a nova API poupa você, desenvolvedor, de uma série de tarefas repetitivas, trabalhosas e propensas a erros na codificação envolvendo datas, horas, períodos e durações. A seguir vemos um trecho onde verificamos se determinado ano é bissexto ou não:

LocalDate hoje = Clock.systemDefaultZone().today();
Year ano = hoje.toYear();
boolean bissexto = ano.isLeap();

Para verificar se um ano é bissexto utilizando java.util.Date você precisaria fazer uma série da cálculos manualmente, pois ao contrário do que se pensa, não basta verificar se o ano é divisível por 4. Já utilizando java.util.GregorianCalendar, temos o método isLeapYear. Estranhamente esse método requer que o ano seja informado como parâmetro ao invés de obter o ano da instância de GregorianCalendar na qual o método executa. Mesmo assim ele não é marcado como static. Ou seja, é bem estranho e pouco intuitivo.

Para calcular a idade de uma pessoa, é outro pesadelo. Aqui vemos como fazer isso utilizando Calendar. Abaixo vemos como é muito mais intuitivo fazer isso utilizando a nova API, onde além da idade em anos, é obtida a diferença completa: P29Y-6M3D.

(assuma que estamos utilizando static imports)

Period nascimento = yearsMonthsDays(1980, 11, 25);
Period hoje = yearsMonthsDays(2009, 5, 28);

System.out.println(hoje.minus(nascimento));

No futuro, poderemos fazer isso de forma ainda mais simples, utilizando a classe Years, algo como Years.between(data1, data2).

Além disso tudo a API cobre uma série de outros pontos interessantes como, por exemplo, as questões de horário de verão. Para conferir isso, recomendo você comprar a revista!


free b2evolution skin