這是我參與8月更文挑戰的第10天,活動詳情查看:8月更文挑戰java
從 5.2 開始,aviatorscript 支持 use 語句,相似 java 裏的 import 語句,能夠導入 java 類到當前命名空間,減小在 new 或者 try...catch 等語句裏寫完整報名的累贅方式。 use
語句的使用方式多種,最簡單的狀況是導入單個 Java 類:markdown
## examples/new.av
use java.util.Date;
let d = new Date();
p(type(d));
p(d);
複製代碼
use 包名.類名
就能夠導入任意一個類到當前上下文。less
若是要導入某個包下面的任意類,能夠用通配符 *
:post
## examples/use.av
use java.util.*;
let list = new ArrayList(10);
seq.add(list, 1);
seq.add(list, 2);
p("list[0]=#{list[0]}");
p("list[1]=#{list[1]}");
let set = new HashSet();
seq.add(set, "a");
seq.add(set, "a");
p("set type is: " + type(set));
p("set is: #{set}");
複製代碼
咱們把 java.util
包下的類都導入,所以能夠直接 new
一個 ArrayList 或者 HashSet,並使用:spa
list[0]=1
list[1]=2
set type is: java.util.HashSet
set is: [a]
複製代碼
若是你只是想引入包下的數個類,而不是所有,能夠經過 use 包名.{類1, 類2...}
的方式,看一個更復雜的例子線程
use java.util.concurrent.locks.{ReentrantLock, ReentrantReadWriteLock};
use java.util.concurrent.CountDownLatch;
let x = 0;
let n = 10;
let lk = new ReentrantLock();
let latch = new CountDownLatch(n);
for i in range(0, n) {
let t = new Thread(lambda() ->
lock(lk);
x = x + 1;
unlock(lk);
countDown(latch);
p("thread #{i} done");
end);
start(t);
}
await(latch);
p("x=#{x}");
let lk = new ReentrantReadWriteLock();
let wlk = writeLock(lk);
lock(wlk);
x = x + 1;
unlock(wlk);
p("x=#{x}");
複製代碼
咱們使用 ReentranLock
來保護變量 x
,而且使用 CountDownLatch
來同步全部線程執行完成。接下來咱們用 ReentrantReadWriteLock
讀寫鎖來保護 x
。能夠看到 use java.util.concurrent.locks.{ReentrantLock, ReentrantReadWriteLock};
這一行代碼導入了兩個 Lock 類。code
執行輸出:orm
thread 4 done
thread 5 done
thread 2 done
thread 0 done
thread 3 done
thread 1 done
thread 6 done
thread 7 done
thread 8 done
thread 9 done
x=10
x=11
null
複製代碼
AviatorScript 中的條件語句和其餘語言沒有太大區別:ip
if(true) {
println("in if body");
}
複製代碼
上面的代碼執行,將打印 in if body
。 if 接受一個布爾表達式,若是其值爲 true
就執行後續的代碼塊。若是爲 false
,能夠帶上 else
語句執行其中的代碼塊,代碼塊都是以大括號包起來:字符串
if(false) {
println("in if body");
} else {
println("in else body");
}
``
**請注意,代碼塊都必須用大括號包起來,哪怕是單行語句,這跟 java 是不同的**。
`if` 後面連着的表達式的括號是能夠忽略,上面的例子能夠改寫成:
複製代碼
if false { println("in if body"); } else { println("in else body"); }
連續的條件判斷能夠用複雜的
複製代碼
if test1 { ... } else { if test2 { ... } else { if test3 { ... } else ... } }
嵌套結構,可是更應該直接使用 `elsif` 語句,相似 Java 中的 `else if` ,好比咱們寫一個猜數字的例子:
複製代碼
let a = rand(1100);
if a > 1000 { println("a is greater than 1000."); } elsif a > 100 { println("a is greater than 100."); } elsif a > 10 { println("a is greater than 10."); } else { println("a is less than 10 "); }
println("a is " + a + ".");
好比上面的代碼寫生成一個 `[0, 1100)` 內的整數,而後經過一系列條件語句,判斷 `a` 的範圍,並打印相應的字符串,最後打印 `a` 的值是多少。一樣 `elsif` 對應的判斷語句的括號也是能夠忽略的。
複製代碼