Here’s some code I’m writing for my day-job.
I have an iterator of IScoreObjects (basically things that live on a musical score or timeline).
I want an iterator of only the Notes. Where Notes are one of the things that implement the IScoreObject interface and can live on the score.
Here’s my code.
import java.util.Iterator; public class NoteIterator implements Iterator<Note> { /** * Takes an iterator of IScoreObjects and returns an Iterator of only the Notes */ Iterator<IScoreObject> isoIterator; Note _next; boolean _hasNext; public NoteIterator(Iterator<IScoreObject> isoi) { isoIterator = isoi; findNext(); } private void findNext() { while (isoIterator.hasNext()) { IScoreObject n = isoIterator.next(); if (n.isNote()) { _next = (Note)n; _hasNext = true; return; } } _next = null; _hasNext = false; } @Override public boolean hasNext() { return _hasNext; } @Override public Note next() { Note rv = _next; findNext(); return rv; } }
On the other hand, here’s how I’d do it in Clojure
(defn just-the-notes [score-objects] (filter .isNote score-objects))
This is literally something like a 20:1 ratio in line count. And the Java needs an extra file of its own. That is insane.
Leave a Reply
You must be logged in to post a comment.