这是我参与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` 对应的判断语句的括号也是能够忽略的。
复制代码