Home | FAQ | Contact me

Java Lists

This is a collection of cool things to do with lists as they are encountered and I get excited enough to write them down. (I'm getting long enough in the Java tooth that I don't always recognize when I should note something for general interest.)

How to initialize a static List in Java

Here's a neat trick that works real well. It's just complicated enough that it might not occur to you. This is Java 5+ stuff, of course.

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

public class Songs
{
  /* method 1: */
  public static final List< String > songs = new ArrayList<>();;

  static
  {
    songs.add( "Ina Gaddah Da Vida" );
    songs.add( "I Saw Her Diary" );
    songs.add( "The Sounds of Silence" );
    songs.add( "Dead Skunk in the Middle of the Road" );
    songs.add( "Cripplecreek Ferry" );
  }

  /* method 2: */
  public static final List< String > songs = Arrays.asList(
    "Ina Gaddah Da Vida",
    "I Saw Her Diary",
    "The Sounds of Silence",
    "Dead Skunk in the Middle of the Road",
    "Cripplecreek Ferry"
  );
}

How to initialize a static List with a single element

import java.util.List;
import java.util.ArrayList;
import java.util.Collections;

public class Songs
{
  /* initialize a new list of 1 element only */
  public static final List< String > songs = Collections.singletonList( "Cripplecreek Ferry" );

  public void add( final String another )
  {
    songs.add( another );
  }
}

Travering the list

Traversing a list is child's play. Here are two methods.

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

  public static final List< String > songs = Arrays.asList(
    "Ina Gaddah Da Vida",
    "I Saw Her Diary",
    "The Sounds of Silence",
    "Dead Skunk in the Middle of the Road",
    "Cripplecreek Ferry"
  );

  /* method 1: since Java 5 */
  for( String song : songs )
  {
    System.out.println( song );
  }

  /* method 2: use an Iterator */
  Iterator< String > it = songs.iterator();

  while( it.hasNext() )
  {
    String song = it.next()
    System.out.println( song );
  }

Travering two lists simultaneously

It's less obvious how to traverse two lists at the same time because you need to walk them together and interact between them.

import org.junit.Test;
import static org.junit.Assert.assertEquals;

import java.util.List;
import java.util.ArrayList;
import java.util.Iterator;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Logger;

public class LoggingTest
{
  private static final Logger log = LogManager.getLogger( LoggingTest.class );

  @Test
  public void testGetLevelFromString()
  {
    LoggingUtilities.setLevel( log, Level.OFF );

    List< Level >  levels = setUpExpectedLevels();
    List< String > tries  = setUpLevelTries();

    // here's where it happens...
    Iterator< Level >  level = levels.iterator();
    Iterator< String > shot  = tries.iterator();

    while( level.hasNext() && shot.hasNext() )
    {
      Level expected = level.next();
      Level actual   = LoggingUtilities.levelFromString( shot.next() );

      System.out.println( "  Actual: " + actual );
      System.out.println( "Expected: " + expected );
      assertEquals( actual, expected );
    }
  }

  private List< Level > setUpExpectedLevels()
  {
    List< Level > levels = new ArrayList<>();
    levels.add( Level.TRACE ); levels.add( Level.TRACE );
    levels.add( Level.DEBUG ); levels.add( Level.DEBUG );
    levels.add( Level.INFO );  levels.add( Level.INFO );
    levels.add( Level.WARN );  levels.add( Level.WARN );
    levels.add( Level.ERROR ); levels.add( Level.ERROR );
    levels.add( Level.FATAL ); levels.add( Level.FATAL );
    levels.add( Level.OFF );   levels.add( Level.OFF );
    levels.add( Level.OFF );

    return levels;
  }

  private List< String > setUpLevelTries()
  {
    List< String > tries = new ArrayList<>();
    tries.add( "6" ); tries.add( "TRACE" );
    tries.add( "5" ); tries.add( "dEbUg" );
    tries.add( "4" ); tries.add( "InFo" );
    tries.add( "3" ); tries.add( "warn" );
    tries.add( "2" ); tries.add( "error" );
    tries.add( "1" ); tries.add( "fatal" );
    tries.add( "0" ); tries.add( "off" );

    tries.add( "Uncle Skeezix" );
    return tries;
  }
}