函數語言程式設計下的Iterator模式
在模式下,Iterator模式是一個思路相對簡單的模式。
迭代器(Iterator)模式,又叫做遊標(Cursor)模式。GOF給出的定義為:提供一種方法訪問一個容器(container)物件中各個元素,而又不需暴露該物件的內部細節。
在“iluwatar/java-design-patterns”中,有一個Iterator模式例子,其類圖如下所示:
Iterator模式的關鍵就是要對外公開一個迭代器介面,該介面擁有hasNext()
和next()
這兩個方法,如下所示:
public interface ItemIterator {
boolean hasNext();
Item next();
}
然後在迭代器的實現類裡實現這兩個方法,具體的程式碼就不再給出,請參考:一個關於Iterator模式的例子
我們知道,Iterator模式能夠實現迭代的關鍵是next()
方法;而函數語言程式設計下,Stream類也有很多方法迭代的方法,如forEach
和peak
等,因此,我們認為實現了函子(functor)的Stream類就是一個完整的迭代器。
下面,我們使用Stream類實現“iluwatar/java-design-patterns”中的例子。
ItemType這個類還是不變:
public enum ItemType {
ANY, WEAPON, RING, POTION
}
Item類也不變:
public class Item {
private ItemType type;
private String name;
public Item(ItemType type, String name) {
this.setType(type);
this.name = name;
}
@Override
public String toString() {
return name;
}
public ItemType getType() {
return type;
}
public final void setType(ItemType type) {
this.type = type;
}
}
變化較大的是TreasureChest類:
public class TreasureChest {
private List<Item> items;
public TreasureChest() {
items = new ArrayList<>();
items.add(new Item(ItemType.POTION, "Potion of courage"));
items.add(new Item(ItemType.RING, "Ring of shadows"));
items.add(new Item(ItemType.POTION, "Potion of wisdom"));
items.add(new Item(ItemType.POTION, "Potion of blood"));
items.add(new Item(ItemType.WEAPON, "Sword of silver +1"));
items.add(new Item(ItemType.POTION, "Potion of rust"));
items.add(new Item(ItemType.POTION, "Potion of healing"));
items.add(new Item(ItemType.RING, "Ring of armor"));
items.add(new Item(ItemType.WEAPON, "Steel halberd"));
items.add(new Item(ItemType.WEAPON, "Dagger of poison"));
}
public Stream<Item> stream()
{
return this.items.stream();
}
此處輸入程式碼基於Stream類的迭代器實現起來比Iterator模式簡單多了,因為Stream類本身就實現了迭代方法。
下面,我們來看如何使用:
public class App {
private static final Logger LOGGER = LoggerFactory.getLogger(App.class);
public static void main(String[] args) {
TreasureChest chest = new TreasureChest();
chest.stream().filter(item -> item.getType() == RING).forEach(item -> LOGGER.info(item.toString()));
LOGGER.info("----------");
chest.stream().filter(item -> item.getType() == POTION).forEach(item -> LOGGER.info(item.toString()));
LOGGER.info("----------");
chest.stream().filter(item -> item.getType() == WEAPON).forEach(item -> LOGGER.info(item.toString()));
LOGGER.info("----------");
chest.stream().filter(item -> item.getType() != ANY).forEach(item -> LOGGER.info(item.toString()));
}
}
可以看到,藉助於Stream類和函數語言程式設計的迭代,遠比物件導向實現Itreator模式的迭代要簡單得多,而更加靈活的函數語言程式設計實現的迭代,只需要我們掌握了函子(functor),就可以實現。
參考文獻:模式-Iterator模式
相關文章
- 函數語言程式設計函數程式設計
- 函數語言程式設計讓你忘記設計模式函數程式設計設計模式
- Scala 函數語言程式設計(一) 什麼是函數語言程式設計?函數程式設計
- 使用函數語言程式設計重構模板模式函數程式設計模式
- RAC的函數語言程式設計函數程式設計
- 函數語言程式設計瞭解一下(下)函數程式設計
- 函數語言程式設計,真香函數程式設計
- python函數語言程式設計Python函數程式設計
- javascript函數語言程式設計JavaScript函數程式設計
- JavaScript 函數語言程式設計JavaScript函數程式設計
- Java 函數語言程式設計Java函數程式設計
- JavaScript中的函數語言程式設計JavaScript函數程式設計
- C++的函數語言程式設計C++函數程式設計
- [譯] JavaScript 的函數語言程式設計是一種反模式JavaScript函數程式設計模式
- python函數語言程式設計一Python函數程式設計
- python函數語言程式設計二Python函數程式設計
- JavaScript 函數語言程式設計(一)JavaScript函數程式設計
- JavaScript 函數語言程式設計(三)JavaScript函數程式設計
- 函數語言程式設計前菜函數程式設計
- 函數語言程式設計雜談函數程式設計
- 初見函數語言程式設計函數程式設計
- JavaScript 函數語言程式設計(二)JavaScript函數程式設計
- 函數語言程式設計瞭解一下(上)函數程式設計
- 函數語言程式設計-鏈式程式設計RAC函數程式設計
- .NET併發程式設計-函數語言程式設計程式設計函數
- Python函數語言程式設計術語大全Python函數程式設計
- Java8的函數語言程式設計Java函數程式設計
- 我對函數語言程式設計的理解函數程式設計
- Java 函數語言程式設計的前生今世Java函數程式設計
- DDD的函數語言程式設計實現函數程式設計
- 函數語言程式設計的幾個概念函數程式設計
- Js中函數語言程式設計的理解JS函數程式設計
- 函數語言程式設計瞭解一下(JavaScript描述)函數程式設計JavaScript
- [譯] JavaScript 函數語言程式設計指引JavaScript函數程式設計
- 如何提高函數語言程式設計技巧函數程式設計
- 從函數語言程式設計說起函數程式設計
- 資料流&函數語言程式設計函數程式設計
- JavaScript函數語言程式設計學習JavaScript函數程式設計