Wednesday, June 16, 2010

I was messing around with the google collection API. It has the ability to do functional-like programming.

When using inner classes where you should use closures, one looks forward to Java with closures.

import java.util.Collection;

import java.util.Set;

import org.junit.Test;

import com.google.common.base.Function;

import com.google.common.base.Predicate;

import com.google.common.collect.Collections2;

import com.google.common.collect.ImmutableSet;

public class GoogleCollectionTest {

public static class Employee {

private String firstName;

private String lastName;

private String phone;

public Employee(String firstName, String lastName, String phone) {

this.firstName = firstName;

this.lastName = lastName;

this.phone = phone;


public Employee() {


public String getFirstName() {

return firstName;


public String getLastName() {

return lastName;


public String getPhone() {

return phone;


public String toString() {

return new StringBuilder(80).append(firstName).append(' ').append(lastName).toString();



public static class Phone {

private String areaCode;

private String prefix;

private String number;

public Phone() {


public Phone(String areaCode, String prefix, String number) {

this.areaCode = areaCode;

this.prefix = prefix;

this.number = number;


public String getAreaCode() {

return areaCode;


public String getPrefix() {

return prefix;


public String getNumber() {

return number;



public String toString() {

return new StringBuilder(50).append('(').append(areaCode).append(')')




public static Employee employee(String firstName, String lastName, String phone) {

return new Employee(firstName, lastName, phone);


public static Set employees (Employee... arguments) {

return ImmutableSet.of(arguments);


public static class OnlyTucsonEmployees implements Predicate{

public boolean apply(Employee input) {

if (input.getPhone().startsWith("520")) {

return true;


return false;



private static final OnlyTucsonEmployees tucsonEmployeesPredicate = newOnlyTucsonEmployees();

public static class EmployeeToPhone implements Function {


public Phone apply(Employee from) {

String[] phoneComps = from.phone.split("-");

return new Phone(phoneComps[0], phoneComps[1], phoneComps[2]);



private static final EmployeeToPhone employeeToPhoneFunction = new EmployeeToPhone();


public void Test() {

Set employees = employees(

employee("Rick", "Hightower", "520-555-1212"),

employee("Noah", "Hightower", "520-555-1212"),

employee("Ryan", "Hightower", "520-555-1212"),

employee("Lucas", "Hightower", "520-555-1212"),

employee("Whitney", "Hightower", "520-555-1212"),

employee("Stephane", "Loonadi", "614-888-1515")


Collection tucsonEmployees = Collections2.filter(employees,tucsonEmployeesPredicate);


Collection phoneNumbers = Collections2.transform(employees,employeeToPhoneFunction);


Collection tucsonPhoneNumbers = Collections2.transform(Collections2.filter(employees, tucsonEmployeesPredicate),employeeToPhoneFunction);




No comments:

Post a Comment

Kafka and Cassandra support, training for AWS EC2 Cassandra 3.0 Training