ç®å½
1. é»è®¤å¯¼å ¥
2. å¤æ¹æ³ï¼è¿è¡æ¶ååï¼
3. æ°ç»åå§å
4. å ä½ç¨åå¯è§æ§
5. ARM 代ç å
6. å é¨ç±»
6.1 éæå é¨ç±»
6.2 å¿åå é¨ç±»
6.3 å建ééæå é¨ç±»çå®ä¾
7. Lambda 表达å¼
8. GString
9. å符串åå符åé¢é
10. åå§ç±»ååå è£ ç±»
11. == æä½ç¬¦çè¡ä¸º
12. é¢å¤çå ³é®å
Groovy ä¸ç´å¨å°è¯è®©Â Java å¼åè 们å¨ä½¿ç¨è¯¥è¯è¨æ¶å°½å¯è½çèªç¶ãå¨è®¾è®¡ Groovy æ¶ï¼æ们å°è¯éµå¾ªäºæå°æ讶åçï¼å°¤å ¶å ³æ³¨æ¥èªÂ Java ä¸ççå¼åè 们å¨å¦ä¹ Groovy æ¶çä½éªã
ä¸é¢æ们ååº Groovy å Java ä¹é´åå¨çææ主è¦åºå«ã
Â
1. é»è®¤å¯¼å ¥
ä¸é¢è¿äºå åç±»å¨ Groovy ä¸é½æ¯é»è®¤å¯¼å ¥çï¼æ以ä¸åéè¦ä½¿ç¨æ¾å¼ç import è¯å¥æ¥å¯¼å ¥å®ä»¬ï¼
- java.io.*
- java.lang.*
- java.math.BigDecimal
- java.math.BigInteger
- java.net.*
- java.util.*
- groovy.lang.*
- groovy.util.*
Â
2. å¤æ¹æ³ï¼è¿è¡æ¶ååï¼
å¨ Groovy ä¸ï¼æç»è¦è°ç¨åªä¸ªæ¹æ³æ¯å¨è¿è¡æ¶å³å®çãè¿å°±æ¯è¿è¡æ¶ååæå«åå¤æ¹æ³ãè¿æå³çï¼è¦è°ç¨çæ¹æ³ä¼å¨è¿è¡æ¶æ ¹æ®æ¹æ³åæ°çå ·ä½ç±»åæ¥éæ©ãå¨ Java å´ä¸ä¹ç¸åï¼Java ä¸çæ¹æ³è°ç¨æ¯å¨ç¼è¯æ¶ç¡®å®çï¼åºäºæ¹æ³ä¸å£°æçç±»åã
ä¸é¢è¿æ®µ Java 代ç å¨ Java å Groovy ä¸é½æ¯å¯ä»¥ç¼è¯éè¿çï¼ä½æ¯å´å ·æä¸åçè¡ä¸ºï¼
int method(String arg) {
return 1;
}
int method(Object arg) {
return 2;
}
Object o = "Object";
int result = method(o);
å¨ Java ä¸æè¨ç»æå¦ä¸ï¼
assertEquals(2, result);
å¨ Groovy ä¸å´å¾å°ä¸é¢è¿ä¸ªä¸åçç»æï¼
assertEquals(1, result);
è¿æ¯å 为 Java ä¼ä½¿ç¨éæç±»åä¿¡æ¯ï¼ä¹å°±æ¯è¯´ o 被声ææäºä¸ä¸ª Objectï¼è Groovy ä¼å¨è¿è¡æ¶è¿è¡æ¹æ³éæ©ï¼æ ¹æ®åæ°çå®é ç±»åæ¥å³å®ï¼å 为å®é 使ç¨äºä¸ä¸ªå符串æ¥è°ç¨æ¹æ³ï¼æ以éæ©äº String çæ¬çæ¹æ³ã
Â
3. æ°ç»åå§å
å¨ Groovy ä¸ï¼{ ... } 代表çæ¯éå ãè¿æå³çä½ ä¸å¯ä»¥åä¸é¢è¿æ ·å建æ°ç»åé¢éï¼
int[] array = { 1, 2, 3}
æ£ç¡®çå建æ¹æ³åä¸é¢è¿æ ·ï¼
int[] array = [1,2,3]
Â
4. å ä½ç¨åå¯è§æ§
å¨ Groovy ä¸ï¼çç¥å段åé¢ç修饰符ï¼å¹¶ä¸ä¼å Java ä¸é£æ ·å¯¼è´è¯¥å段åæå ç§æå段ï¼
class Person {
String name
}
ç¸åï¼å®å®é ä¸æ¯å建äºä¸ä¸ªå±æ§ï¼å°±æ¯è¯´ï¼å建äºä¸ä¸ªç§æå段ï¼åä¸è¯¥å段ç¸å ³çååå¨ï¼getter å setterï¼ã
æ们å¯ä»¥ä½¿ç¨ @PackageScope 注解æ¥å°ä¸ä¸ªå段声æ为å ç§æå段ï¼
class Person {
@PackageScope String name
}
Â
5. ARM 代ç å
Groovy ä¸æ¯ææ¥èª Java 7 ç ARMï¼èªå¨èµæºç®¡çï¼ä»£ç åãç¸åï¼Groovy æä¾äºè®¸å¤åºäºéå çæ¹æ³æ¥è¾¾å°åæ ·çææï¼èä¸æ´å 符å·ä½¿ç¨ä¹ æ¯ãä¾å¦ï¼
Path file = Paths.get("/path/to/file");
Charset charset = Charset.forName("UTF-8");
try (BufferedReader reader = Files.newBufferedReader(file, charset)) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
è¿æ®µ Java 代ç å¨ Groovy ä¸åæ³ç±»ä¼¼è¿æ ·ï¼
new File('/path/to/file').eachLine('UTF-8') {
println it
}
æè ï¼å¯ä»¥åæä¸é¢è¿ä¸ªæ´è´´è¿ Java ççæ¬ï¼
new File('/path/to/file').withReader('UTF-8') { reader ->
reader.eachLine {
println it
}
}
Â
6. å é¨ç±»
Groovy ä¸å¿åå é¨ç±»ååµå¥ç±»çå®ç°éµå¾ª Java çè§èï¼ä½æ¯è¯»è ä¸åºè¯¥æ¿åº Java è¯è¨è§èæ¥ï¼å¨äºè çå·®å¼ç¹ä¸å¯¹ Groovy äºä»¥å¦å®ãGroovy ä¸å¯¹è¿é¨åçå®ç°çèµ·æ¥å°±åå¨Â groovy.lang.Closure ä¸ Groovy ååºçå³å®ä¸æ ·ï¼æçä½åæä¸åãä¾å¦ï¼è®¿é®ç§æçå段åæ¹æ³ä¼åºé®é¢ï¼ä½å¦ä¸æ¹é¢å±é¨åéå´ä¸åéè¦æ¯ final çã
Â
6.1 éæå é¨ç±»
ä¸é¢æ¯ä¸ä¸ªéæå é¨ç±»çä¾åï¼
class A {
static class B {}
}
new A.B()
éæå é¨ç±»ç使ç¨æ¯è¢«æ¯æçæ好çä¸ä¸ªãå¦æä½ ç¡®å®éè¦ä¸ä¸ªå é¨ç±»ï¼è¯·å°å®è®¾ç½®æéæçã
Â
6.2 å¿åå é¨ç±»
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
CountDownLatch called = new CountDownLatch(1)
Timer timer = new Timer()
timer.schedule(new TimerTask() {
void run() {
called.countDown()
}
}, 0)
assert called.await(10, TimeUnit.SECONDS)
Â
6.3 å建ééæå é¨ç±»çå®ä¾
å¨ Java ä¸å 许è¿æ ·åï¼
public class Y {
public class X {}
public X foo() {
return new X();
}
public static X createX(Y y) {
return y.new X();
}
}
Groovy ä¸æ¯æ y.new X() è¯æ³ãä½ éè¦åä¸é¢è¿æ®µä»£ç ä¸ä¸æ ·ï¼åæ new X(y)ï¼
public class Y {
public class X {}
public X foo() {
return new X()
}
public static X createX(Y y) {
return new X(y)
}
}
请注æï¼Groovy æ¯æå¨ä¸ä¼ åæ°çæ åµä¸è°ç¨ååæ°æ¹æ³ãè¿æ¶æ¹æ³çåæ°ä¼è¢«è®¾ç½®æ nullãè¿ä¸ªè§åä¹éç¨äºè°ç¨æé å½æ°ãè¿å°±åå¨ä¸ä¸ªå±é©ï¼ä½ å¯è½æ³å new X(this) ä½æ¯å´åæäºÂ new X()ãç±äº new X() å new X(this) é½æ¯å¾å¸¸è§çç¨æ³ï¼ç®åæ们没ææ¾å°è¾å¥½çæ¹æ³æ¥é¿å ä¸é¢çé®é¢ã
Â
7. Lambda 表达å¼
Java 8 æ¯æ lambda 表达å¼åæ¹æ³å¼ç¨ï¼
Runnable run = () -> System.out.println("Run");
list.forEach(System.out::println);
Java 8 ç lambda 表达å¼ç±»ä¼¼äºå¿åå é¨ç±»ãGroovy ä¸æ¯æ lambda 表达å¼è¿ç§è¯æ³ï¼ä½æ¯ Groovy æéå å¯ä»¥æ¿ä»£å®ï¼
Runnable run = { println 'run' }
list.each { println it } // or list.each(this.&println)
Â
8. GString
å¨ Groovy ä¸ï¼ç±åå¼å·æ¬èµ·æ¥çå符串åé¢é被解é为 GStringï¼æå¼å符串ï¼å¦ "${name}"ï¼ãå¦æä¸ä¸ªç±»ä¸æ个å å« $ çå符串åé¢éï¼å¨ä½¿ç¨ Groovy å Java ç¼è¯å¨è¿è¡ç¼è¯æ¶ï¼Groovy å¯ä»¥ä¼æ¥ç¼è¯é误ï¼æè çæä¸æ®µä¸æå¯è§çä¸åäº Java ç代ç ã
尽管ä¸è¬æ¥è¯´ï¼å¦æä¸ä¸ª API ä¸å£°æäºåæ°ç±»åï¼Groovy ä¼èªå¨å¨ GString å String ä¹é´å转æ¢ä»¥æ»¡è¶³ API è¦æ±ï¼ä½æ¯è¯·æ³¨æé£äºå£°ææ¶æ¥å Object ç±»ååæ°ï¼ä¹åå对å®é åæ°ç±»ååæ£æ¥ç Java APIã
Â
9. å符串åå符åé¢é
åå¼å·æ¬èµ·æ¥çåé¢éå¨ Groovy ä¸è¢«è§£é为å符串 Stringï¼åå¼å·æ¬èµ·æ¥çå符串å¯è½æ¯ String ä¹å¯è½æ¯ GString è¿å ·ä½è¦çå符串åé¢éä¸æ¯å¦ææå¼åçã
assert 'c'.getClass()==String
assert "c".getClass()==String
assert "c${1}".getClass() in GString
åªæå½åä¸ä¸ª char ç±»åçåéèµå¼æ¶ï¼Groovy æä¼èªå¨å°ä¸ä¸ªåå¼å·æ¬èµ·æ¥çåå符 String 转æ¢ä¸º charãå½è°ç¨æ¥å char ç±»ååæ°çæ¹æ³æ¶ï¼æ们è¦ä¹è¿è¡æ¾å¼çç±»å转æ¢ï¼è¦ä¹ç¡®ä¿åæ°å¼å¨è°ç¨åå·²ç»è½¬æ¢å¥½äºã
char a='a'
assert Character.digit(a, 16)==10 : 'But Groovy does boxing'
assert Character.digit((char) 'a', 16)==10
try {
assert Character.digit('a', 16)==10
assert false: 'Need explicit cast'
} catch(MissingMethodException e) {
}
Groovy æ¯æ两ç§é£æ ¼çç±»å转æ¢ï¼å°±è½¬æ¢ä¸º char èè¨ï¼å½å¯¹ä¸ä¸ªå¤å符çå符串è¿è¡è½¬æ¢æ¶åå¨ç»å¾®çä¸åï¼Groovy é£æ ¼ç转æ¢ï¼ä½¿ç¨ asï¼æ´å 宽æ¾ï¼å®ä¼å»å符串ä¸ç第ä¸ä¸ªå符ï¼C é£æ ¼çç±»å转æ¢å°ä¼æåºå¼å¸¸ï¼
// å¤çåå符çå符串æ¶ï¼å®ä»¬ææç¸å
assert ((char) "c").class==Character
assert ("c" as char).class==Character
// å¤çå¤å符å符串æ¶ï¼å®ä»¬ææä¸å
try {
((char) 'cx') == 'c'
assert false: 'will fail - not castable'
} catch(GroovyCastException e) {
}
assert ('cx' as char) == 'c'
assert 'cx'.asType(char) == 'c'
Â
10. åå§ç±»ååå è£ ç±»
å ä¸ºå¨ Groovy ä¸ä¸åç对象ï¼å®ä¼èªå¨å è£ åå§ç±»åçå¼ç¨ã以æ¤ï¼ä»å Java çè¡ä¸ºä¸ä¸æ ·ï¼å¨ Java ä¸ç²¾åº¦æåï¼wideningï¼çä¼å 级é«äºè£ ç®±ãä¸é¢ä½¿ç¨ int å个ä¾åï¼
int i
m(i)
void m(long l) { //1
println "in m(long)"
}
void m(Integer i) { //2
println "in m(Integer)"
}
//1: å¨ Java ä¸ä¼è°ç¨è¯¥æ¹æ³ï¼å 为精度æåçä¼å 级é«äºè£ ç®±
//2: å¨ Groovy ä¸ä¼è°ç¨è¯¥æ¹æ³ï¼å 为ææåå§ç±»åçå¼ç¨é½ä¼ä½¿ç¨å®ä»¬å¯¹åºçå è£ ç±»
Â
11. == æä½ç¬¦çè¡ä¸º
å¨ Java ä¸ï¼== 表示åå§ç±»åçç¸çæ对象身份çç¸åï¼å¼ç¨çç¸çï¼ãå¨ Groovy ä¸ï¼å¦æ对象 aï¼b æ¯ Comparable çï¼Â == 被解éæ a.compareTo(b) == 0ï¼å¦åå°è¢«è§£éæ a.equals(b)ãå¦ææ³æ£æ¥å¼ç¨çç¸çæ§ï¼éè¦ä½¿ç¨ is æä½ç¬¦ï¼å¦ï¼a.is(b)
Â
12. é¢å¤çå ³é®å
Groovy ç¸æ¯ Java å¤äºå¦ä¸è¿äºå ³é®åï¼è¯·ä¸è¦æå®ä»¬ç¨ä½åéåï¼
-
as
-
def
-
in
-
trait
Â
åèæç®ï¼
http://www.groovy-lang.org/differences.html
Â
Â
Â
Â
Â
Â