Code Snippet

Just another Code Snippet site

[Java] Lambda

Lambda (before Java 8) with Lambdaj

enum Gender {
    Male, Female, Unknown;
}
class Person {
    private String name;
    private Integer age;
    private Gender gender;
    private List<Person> children = new ArrayList<Person>();

    // Getters & Setters & Constructors
    // ...
}
import static ch.lambdaj.Lambda.having;
import static ch.lambdaj.Lambda.on;
import static ch.lambdaj.Lambda.select;
import static ch.lambdaj.collection.LambdaCollections.with;
import org.hamcrest.Matcher;
import org.hamcrest.Matchers;

class Main {

    List<Person> allPersons = new ArrayList<Person>();

    {
        allPersons.add(new Person("John Doe", Gender.Male, 21));
        allPersons.add(new Person("Jane Doe", Gender.Female, 32));
        allPersons.add(new Person("Alfred", Gender.Male, 75));
        allPersons.add(new Person("Master Yoda", Gender.Unknown, 900));
    }

    public void simpleFilter { 
        List<Tax> listOfMen = select(allPersons, //
                        having(on(Person.class).getGender(), Matchers.is(Gender.Male));
        // or
        List<Tax> listOfMen2 = with(allPersons).clone() //
                        .retain(having(on(Person.class).getGender(), Matchers.is(Gender.Male));
    }

    public void combineFilters {
        // AND
        List<Tax> listOfMenAndAge21 = select(allPersons, 
                Matchers.allOf(//
                        having(on(Person.class).getGender(), Matchers.is(Gender.Male)), //
                        having(on(Person.class).getAge(), Matchers.equalTo(21))));

        // OR
        List<Tax> listOfMenOrUnknown = select(allPersons, 
                Matchers.anyOf(//
                        having(on(Person.class).getGender(), Matchers.is(Gender.Male)), //
                        having(on(Person.class).getGender(), Matchers.is(Gender.Unknown))));
    }

    public void utils{
        // joinFrom
        String result = Lambda.joinFrom(allPersons).getName();
        // will return : John Doe, Jane Doe, Alfred, Master Yoda

        // forEach
        Lambda.forEach(allPersons).setModifiedBy("Me");

        // sort
        Lambda.sort(allPersons, on(Person.class).getAge());

        // selectMin / selectMax / minFrom / maxFrom
        List<Person> results =
                select(allPersons,
                        having(on(Person.class).getAge(),
                                equalTo(selectMin(allPersons, on(Person.class).getAge()))));

        Integer maxAge = Lambda.maxFrom(allPersons).getAge();
    }

    public void utils2{
        // Add children
        allPersons.get(0).getChildren().add(new Person("John Doe Junior #1", Gender.Female, 1));
        allPersons.get(0).getChildren().add(new Person("John Doe Junior #2", Gender.Male, 2));
        allPersons.get(1).getChildren().add(new Person("Jane Doe Junior", Gender.Male, 2));
        allPersons.get(2).getChildren().add(new Person("Alfred Junior", Gender.Female, 1));
        allPersons.get(3).getChildren().add(new Person("Yoda Junior", Gender.Unknown, 50));

        System.out.println("Persons : \n\t" + allPersons);

        // Collect & Flatten
        List<Person> listOfChildren = flatten(collect(allPersons, on(Person.class).getChildren()));
        System.out.println("Children : \n\t" + listOfChildren);
        // Return : [<John Doe Junior #1>, <John Doe Junior>, <Jane Doe Junior>, <Alfred Junior>, <Yoda Junior>]

        // Filter on flatten list
        List<Person> listOfDaughters =
                select(listOfChildren, having(on(Person.class).getGender(), equalTo(Gender.Female)));
        System.out.println("Daughters : \n\t" + listOfDaughters);
        // Return : [<John Doe Junior #1>, <Alfred Junior>]

        // Retrieve parents
        List<Person> parents =
                select(allPersons,
                        having(on(Person.class).getChildren(), hasItem(isIn(listOfDaughters))));
        System.out.println("Parent of Daughters : \n\t" + parents);
        // Return : 	[<John Doe>, <Alfred>]

        // hasItem(isIn(...)) : Creates a matcher for Iterables that matches if at least one element is present 
    }

}

Maven dependencies :

<dependency>
	<groupId>com.googlecode.lambdaj</groupId>
	<artifactId>lambdaj</artifactId>
	<version>2.3.3</version>
</dependency>

<dependency>
	<groupId>org.hamcrest</groupId>
	<artifactId>hamcrest-all</artifactId>
	<version>1.3</version>
</dependency>
<dependency>
	<groupId>org.exparity</groupId>
	<artifactId>hamcrest-date</artifactId>
	<version>1.1.0</version>
</dependency>


One thought on “[Java] Lambda

  • Olivier says:

    Convert a list of object into a list of String :

        public List<String> toListOfStrings(List<Object> listOfObjects) {
    
            return Lambda.convert(listOfObjects, new Converter<Object, String>() {
    
                @Override
                public String convert(Object from) {
                    return String.valueOf(from.toString());
                }
            });
    
        }
    

Leave a Reply to Olivier Cancel reply

Your email address will not be published. Required fields are marked *