Path: csiph.com!x330-a1.tempe.blueboxinc.net!usenet.pasdenom.info!weretis.net!feeder4.news.weretis.net!nuzba.szn.dk!pnx.dk!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail From: Robert Klemme Newsgroups: comp.lang.java.programmer Subject: Re: for :each style question Date: Thu, 01 Dec 2011 23:36:04 +0100 Lines: 76 Message-ID: <9jqdqlFkoaU1@mid.individual.net> References: <30fdd7tlkkejm29ufduhc9nnfk7uu3c6h0@4ax.com> Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-Trace: individual.net ONBqNDLLTnbE1GbfY4+T0gTSObHz2x8lypuEQMUOszqP/2p+A= Cancel-Lock: sha1:M4IopLmH7eNbNasP+jCtLqsedVk= User-Agent: Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20110929 Thunderbird/7.0.1 In-Reply-To: <30fdd7tlkkejm29ufduhc9nnfk7uu3c6h0@4ax.com> Xref: x330-a1.tempe.blueboxinc.net comp.lang.java.programmer:10406 On 12/01/2011 12:32 AM, Roedy Green wrote: > In a for:each loop, sometimes you want to treat the first and or last > element specially. > > The obvious way to handle is to revert to a for int i= loop and check > for special values of i. > > You can keep the for:each style if you have a boolean first= true that > you set false to detect the first. > > I don't know of an equivalent way to detect the last. The trick for detecting the last element is to defer evaluation of each element by one iteration and handle the last one after the loop. > In the olden days I would have handled the first and last cases > outside the loop, with the loop running over the middle elements. You > can't do that with for:each. > > What do you consider the best style to deal with this? For the fun of it, here is one way to do it - although I find it quite silly: package clj; import java.util.Arrays; public final class FirstLast { private static enum Pos { NONE, FIRST, LATER } public static void firstLast(final Iterable items) { Pos p = Pos.NONE; T last = null; for (final T item : items) { switch (p) { case NONE: p = Pos.FIRST; break; case FIRST: System.out.println("First: " + last); p = Pos.LATER; break; case LATER: System.out.println("Next: " + last); break; } last = item; } if (p != Pos.NONE) { System.out.println("Last: " + last); } } public static void main(String[] args) { System.out.println("empty"); firstLast(Arrays.asList()); System.out.println("one"); firstLast(Arrays.asList("a")); System.out.println("two"); firstLast(Arrays.asList("a", "b")); System.out.println("more"); firstLast(Arrays.asList("a", "b", "c", "d")); } } Kind regards robert