Java使用Aviator表达式 学习记录(八)

这是我参与8月更文挑战的第10天,活动详情查看:8月更文挑战java

# use 语句引用 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` ,好比咱们写一个猜数字的例子:


复制代码

examples/if.av

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` 对应的判断语句的括号也是能够忽略的。













复制代码
相关文章
相关标签/搜索