Groovyの研究ノート二つの基本的な文法

1.デフォルトのインポート
次のインポートリストは常にGroovyのコードの中に隠されています:
groovy.lang.*;
groovy.util.*;
java.lang.*;
java.io.*;
java.math.BigDecimal;
java.math.BigInteger;
java.net.*;
java.util.*;
 
他のJavaクラスを導入する必要は*など持つjava.mathとして、Javaのimport文のインポートに直接使用することができる場合;
2.デジタル処理
GroovyはJavaのBigDecimalの中に浮動小数点数の表現の基礎となる、しかし、それはBigDecimalの行動は、開発者の期待を満たしていることを確認しようとします。
3.変数、動的および静的タイプ、範囲、
(1)動的および静的タイプ
Groovyは動的言語であり、変数の種類のタイプを指定する必要はなく、変数が場合ステートメント(またはリターン)が決定されます。
それに値を割り当てるときに、あなたがいない正しくないタイプで、静的な型の変数を宣言すると、Groovyは、それをチェックアウトし、次のコードを実行し、エラーになりますことができます
a=new Date()
a=1;
Date b=new Date();
b=2.0;
Exception thrown
org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object '2.0' with class 'java.math.BigDecimal' to class 'java.util.Date'
 at ConsoleScript4.run(ConsoleScript4:4)
すなわち、B = 2.0であり、それはエラーを実行する、それが値2.0日付型変数bを割り当てることができません。
スコープ(2)グルービー
クラス、その範囲内GroovyとJavaの、クラス、メソッド、変数の循環範囲について、その範囲は、あなたの考えに関連しています。しかし、Groovyのスクリプトが異なっています。
単純に、Groovyのスクリプトを入れて、2つのスコープがあります
  1. 結合ドメイン、結合ドメインは、スクリプトのグローバルスコープです。
  2. この領域は、この領域は、その変数宣言コードブロックの範囲には限定されています。それは、その範囲のローカルドメインで定義された変数、上に定義されている場合(そのようなスクリプトのトップなど)の変数のために、スクリプトコードブロック内で宣言されました。
定義された変数は、静的な型として宣言、または特別なキーワードでデフ(それは変数定義の未決定のタイプがあること)の変数を定義しています。
    スクリプト内で宣言したメソッドは、この領域にアクセスすることはできません。
 String hello="Hello World";
    void printHello()
    {
        System.out.println(hello);
    }
    printHello();
    これは、次の例外が表示されます。
Exception thrown
    groovy.lang.MissingPropertyException: No such property: hello for class: ConsoleScript6
   at ConsoleScript6.printHello(ConsoleScript6:4)
   at ConsoleScript6.run(ConsoleScript6:6)
    しかし、あなたは、通常の出力Hello Worldの文字列を、削除する場合。
(3)リストやマップの文法
    Groovy中的列表和映射在底层是由Java ArrayList和LinkedHashMap实现的。
    Groovy用方括号[]指定和使用列表结构.
jvmLanguages=["Java","Groovy","Scala","Clojure"];
println(jvmLanguages[0]);
println(jvmLanguages.size());
println(jvmLanguages[0..2])
println(jvmLanguages[-1])
jvmLanguages=[];
println(jvmLanguages);
    输出为:
Java
4
[Java, Groovy, Scala]
Clojure
[]
Groory是动态类型语言,所以可以把不同类型的只保存在列表和映射中。
 jvmLanguages=["Java",2,"Scala",new Date()];
 println(jvmLanguages);
    输出为:
[Java, 2, Scala, Mon Jan 05 14:22:22 CST 2015]
    Groovy处理映射也差不多,用[]符号,并用冒号(:)来分开键值对,以映射.键(map.key)的方式去引用映射中的值。
    
languageRatings=[Java:100,Groovy:99,Clojure:"null"];
println(languageRatings["Java"]);
println(languageRatings.Clojure)
languageRatings["Clojure"]=75;
println(languageRatings["Clojure"]);
println(languageRatings);
languageRatings=[:];
println(languageRatings);
    输出为:
100
null
75
[Java:100, Groovy:99, Clojure:75]
[:]
   4.与Java差异
    (1)Groovy有大量可以省略的语法:
  1.      语句结束处的分号;
  2.     返回语句(return);
  3.     方法参数两边的括号;
  4.     public访问限定符。
 Demo demo=new Demo();
println(demo.doSomething());
public class Demo
{
     public Integer doSomething()
     {
          def x=1
          def y;def String z="Hello World"
          println "the doSomething method be invoked!"
          x=5
      }
}
    输出为:
the doSomething method be invoked!
5
   如果把上面代码中的public都去掉,输出还是一样
   (2)异常处理
    Groovy不区分检查异常和未检查异常。Groovy编译器会忽略方法签名中的所有throws语句。
    (3)相等操作符
    遵循最小以外原则,Groovy把==当做Java中的equals()方法。
    
Integer x=new Integer(2);
    Integer y=new Integer(2);
    Integer z=null;
    if(x==y)
    {
        println "x==y"
    }
    if(!x.is(y))
    {
        println "x is not y"
    }
    if(z.is(null))
    {
        println "z is null"
    }
    if(z==null)
    {
        println "z is null"
    }
 
 输出为:
x==y
x is not y
z is null
z is null
(4)内部类
  Groovy支持内部类,但大多数情况下我们应该用函数字面值替代它。

 

发布了250 篇原创文章 · 获赞 7 · 访问量 3万+

おすすめ

転載: blog.csdn.net/bsr1983/article/details/84694373