|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |
java.lang.Object | +--com.blackperl.Perl.Map
Static-method implementation of the Perl map
keyword.
The map
function iterates over a list of values, applying a
function to each one in turn. It is similar in this aspect to
grep
(see Grep
), except that map
is more
about the evaluation of the provided function, and less about selecting
a sub-set of the input list.
map
takes a block to execute-- one of MapBlock
or
GrepBlock
-- and gathers together the values that the
eval()
method of the block returns. Thus, unlike
grep
, map
may produce more elements than it is
fed as input. In Perl, this is often used for such tasks as generating
associative arrays (the analog of java.util.HashTable
) or
applying list-oriented processing to a set of input values as part of a
larger pipeline (with the output often going to another map
, or
possibly a grep
).
Unfortunately, things like creating hash tables on the fly are not as easy
in Java, as there is no clear way in the foundation classes to promote a
List
instance into a Map
, which is the base
interface needed to instantiate classes such as
java.util.HashTable
or java.util.Hashmap
from
existing data. Instead, the developer would use the functionality of the
MapBlock
or GrepBlock
in the form of a named
(usually private) inner-class with accessors to build up a
Map
from the input objects, then retrieve that data through the
accessors after map
has completed. One of the examples below
illustrates this concept.
This first example shows very basic usage of map
, applying the
split
method of the String
class to the passed-in
elements and producing an arbitrary number of String
objects
as a result:
import com.blackperl.Perl.Map; import com.blackperl.Perl.MapBlock; // Assume "lines" is of type String[] Object[] all = Map.map(new MapBlock() { public Object[] eval(Object o) { return ((String)o).split(","); } }, lines); // "all" is now an array of strings all split up by commasThis example used arrays rather than
List
instances, and it
suffers from the same limitations seen in Grep
. That is, the
returned array is always of type Object[]
, and thus the
elements have to be explicitly cast when they are later referenced.
A common use of map
in Perl is to turn an array of strings
into a testable associative array, so that further input values can be
tested against the list without having to explicitly traverse the list
for every test. This next example shows how this can be done:
import com.blackperl.Perl.Map; import com.blackperl.Perl.MapBlock; import java.util.HashMap; import java.util.List; class MapMaker implements MapBlock { private java.util.Map internalMap; public MapMaker(java.util.Map map) { internalMap = map; } Object[] eval(Object o) { internalMap.put((String)o, Boolean.valueOf(true)); return null; } } // An instance field, which wouldn't otherwise be accessible to a // MapBlock instance HashMap booleanWordMap = new HashMap(); // Assume "words" is set up elsewhere as some implementation of List Map.map(new MapMaker(booleanWordMap), words); // The booleanWordMap hash table now has each string that was // contained within the List called words as a key. The value for // each of these keys is the Boolean object equivalent of "true".One could have the
MapMaker
code count the words, rather than
just map them to true
, depending on the needs of the program
itself.
In cases where it is known that the mapping function is only going to
produce at most one output element per input element, the GrepBlock
interface may be used in place of MapBlock
. This makes it a little
easier to write the eval
hook cleanly, without the need to
create and return an array when only one value is being passed. The next
example shows this (while also using the Ucfirst
component):
import com.blackperl.Perl.Map; import com.blackperl.Perl.GrepBlock; import com.blackperl.Perl.Ucfirst; import java.util.List; // Assume again that "words" is some List object set up elsewhere List capitalizedWords = Map.map(new GrepBlock() { Object eval(Object word) { return Ucfirst.ucfirst(((String)word).toLowerCase()); } }, words);When this has run, the
List
object capitalizedWords
contains all the strings from words
in the same order. Each of
these new strings has been capitalized by first shifting the whole string
to lower-case with the toLowerCase
method, then passing that
result to Ucfirst.ucfirst(java.lang.String)
.
In other words, this code recreates a common Perl idiom:
@capitalized_words = map { ucfirst lc $_ } @words;
All components in this package provide an instance
method to
retrieve a singleton object which may be used to call the static methods,
if the programmer prefers using an object to static invocation.
If this is the JDK 1.5 ("Tiger") edition of the package, this class is
suitable for use via static import. The invocation from the second
example could instead be expressed as (with the changed import
line included):
import com.blackperl.Perl.Map.map; map(new MapMaker(booleanWordMap), words);
Method Summary | |
static com.blackperl.Perl.Map |
instance()
The instance method is used to retrieve the
Map singleton that applications can use in lieu of
invoking the methods statically. |
static java.util.List |
map(com.blackperl.Perl.GrepBlock block,
java.util.List list)
Map the functionality specified by eval() in the
GrepBlock instance over the objects contained in the
List , returning all the values produced as a result. |
static java.lang.Object[] |
map(com.blackperl.Perl.GrepBlock block,
java.lang.Object[] objArray)
Perform map using a GrepBlock interface and an
array of objects (rather than a List instance). |
static java.util.List |
map(com.blackperl.Perl.MapBlock block,
java.util.List list)
Map the functionality specified by eval() in the
MapBlock instance over the objects contained in the
List , returning all the values produced as a result. |
static java.lang.Object[] |
map(com.blackperl.Perl.MapBlock block,
java.lang.Object[] objArray)
Perform map using a MapBlock interface and an
array of objects (rather than a List instance). |
Methods inherited from class java.lang.Object |
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
Method Detail |
public static com.blackperl.Perl.Map instance()
instance
method is used to retrieve the
Map
singleton that applications can use in lieu of
invoking the methods statically.
public static java.util.List map(com.blackperl.Perl.GrepBlock block, java.util.List list)
eval()
in the
GrepBlock
instance over the objects contained in the
List
, returning all the values produced as a result.
block
- The GrepBlock instance that provides eval()list
- The List instance with objects to evaluate in sequence
list
public static java.lang.Object[] map(com.blackperl.Perl.GrepBlock block, java.lang.Object[] objArray)
map
using a GrepBlock
interface and an
array of objects (rather than a List instance).
block
- The GrepBlock instance that provides eval()objArray
- The array of Object to evaluate in sequence
public static java.util.List map(com.blackperl.Perl.MapBlock block, java.util.List list)
eval()
in the
MapBlock
instance over the objects contained in the
List
, returning all the values produced as a result.
block
- The MapBlock instance providing the eval() methodlist
- A List instance providing the objects to be evaluated
list
public static java.lang.Object[] map(com.blackperl.Perl.MapBlock block, java.lang.Object[] objArray)
map
using a MapBlock
interface and an
array of objects (rather than a List instance).
block
- The MapBlock instance providing the eval() methodobjArray
- The array of Object to evaluate in sequence
|
|||||||||
PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||
SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD |