【Guava 教學】(8)你需要的其實是範圍(Range)?
|
【Guava 教學】(7)Multiset、Multimap 與 BiMap << 前情 如果想要建立一個包括 1 到 5 的數列,你會怎麼做?手寫一個 List<Integer> list = new ArrayList<>(20);
for(int i = 1; i <= 20; i++) {
list.add(i);
}
那如果要建立一個數列,包括字元 ‘a’ 到 ‘z’ 呢?也許是這樣寫: List<Character> list = new ArrayList<>(26);
for(char c = 'a'; c <= 'z'; c++) {
list.add(c);
}
如果你需要一個無限長的自然數列呢?實際上不可能在電腦上產生無限長的數列,所以得撰寫個產生器(Generator),只是在 Java 中撰寫產生器有點麻煩。如果使用 Guava 的
你也可以使用字串建立範圍,例如
實際上,範圍不是數列,也就是像
for(int i : create(Range.closed(1, 20), integers())) {
// 做些事 ...
}
for(int i : create(Range.atLeast(1), integers())) {
// 做些運算
if(某些條件) { break; }
}
比起一開始就建立一個包括 class LowerCaseDomain extends DiscreteDomain<Character> {
private static LowerCaseDomain domain = new LowerCaseDomain();
public static DiscreteDomain letters() {
return domain;
}
@Override
public Character next(Character c) {
return (char) (c + 1);
}
@Override
public Character previous(Character c) {
return (char) (c - 1);
}
@Override
public long distance(Character start, Character end) {
return end - start;
}
@Override
public Character maxValue() {
return 'z';
}
@Override
public Character minValue() {
return 'a';
}
}
在繼承 如果你指定的範圍是無界的,像是指定 private static final class IntegerDomain extends DiscreteDomain<Integer>
implements Serializable {
...
@Override public Integer minValue() {
return Integer.MIN_VALUE;
}
@Override public Integer maxValue() {
return Integer.MAX_VALUE;
}
...
}
同理, private static final class LongDomain extends DiscreteDomain<Long>
implements Serializable {
...
@Override public Long minValue() {
return Long.MIN_VALUE;
}
@Override public Long maxValue() {
return Long.MAX_VALUE;
}
...
}
先前定義的 for(char i : create(Range.closed('a', 'z'), LowerCaseDomain.letters())) {
// 做些事 ...
}
for(char i : create(Range.atLeast('m'), LowerCaseDomain.letters())) {
// 做些事 ...
}
實際上,你需要的或許只是範圍,那麼用 |

Java 學習之路




