The document outlines the agenda and content of a Java Lambda Stream master class, focusing on API design, functional interfaces, and streams with practical exercises. It includes examples of consumers, predicates, and comparators, as well as implementing functional programming concepts. Additionally, resources such as GitHub links and further class details are provided.
Introduction to Devoxx and Java Lambda Stream Master Class details, requiring laptops for participation.
LambdaHOL features 80 exercises related to Java lambdas, functional interfaces, and streams, with solutions available at a specified GitHub link.
The agenda includes API design with lambdas and functional interfaces, followed by streams, reductions, and collectors.
API design topics including chaining lambdas, consumer and predicate interfaces, and an example of partial application.
Definition and implementation of functional interfaces, explaining their role in handling single abstract methods.
Code examples demonstrating the usage of consumer functional interface for modifying lists, including asserting conditions in tests.
Code examples for predicate functional interface, exploring negation and conditional checks on strings, including tests.
Code examples demonstrating various comparator implementations for sorting objects based on multiple criteria, including using lambda expressions.
Real-world coding examples include a currency converter based on given data and a validator pattern using functional interfaces.
Preview of the second day’s content focused on functional programming, streams, reductions, collectors, and coffee break. Topics include map, filter, reduce, advanced reduction, collectors, and challenges, concluding with invitation for questions.
#LambdaHOL#Devoxx
The LambdaHOL
8 testclasses, with 80 exercises to complete
- Lambda, functionnal interfaces
- Comparators
- Streams, Collectors
- Some challenges at the end
- Updated regularly
With solutions!
#LambdaHOL#Devoxx
1st example
A consumerthat clears a string builder
@Test
public void consumer_1() {
Consumer<List<String>> consumer = null; // TODO
List<String> list =
new ArrayList<>(Arrays.asList("a", "b", "c"));
consumer.accept(list);
assertThat(list).isEmpty();
}
18.
#LambdaHOL#Devoxx
2nd example
A consumerthat calls two Consumers
@Test
public void consumer_2() {
Consumer<List<String>> c1 = list -> list.add("first");
Consumer<List<String>> c2 = list -> list.add("second");
Consumer<List<String>> consumer; // TODO
List<String> list =
new ArrayList<>(Arrays.asList("a", "b", "c"));
consumer.accept(list);
assertThat(list).containsExactly("a", "b", "c", "first", "second");
}
#LambdaHOL#Devoxx
1st example
A predicatethat negates another predicate
@Test
public void predicate_1() {
Predicate<String> predicate = s -> s.isEmpty();
Predicate<String> notPredicate; // TODO
assertThat(notPredicate.test("")).isFalse();
assertThat(notPredicate.test("Not empty!")).isTrue();
}
21.
#LambdaHOL#Devoxx
2nd example
A predicatethat is true if a string is non null
and non empty
@Test
public void predicate_2() {
Predicate<String> p1 = s -> s != null;
Predicate<String> p2 = s -> s.isEmpty();
Predicate<String> p3; // TODO
assertThat(p3.test("")).isFalse();
assertThat(p3.test(null)).isFalse();
assertThat(p3.test("Not empty!")).isTrue();
}
22.
#LambdaHOL#Devoxx
3rd example
How todesign a xOr() method on Predicate?
@Test
public void predicate_3() {
Predicate<String> p1 = s -> s.length() == 4;
Predicate<String> p2 = s -> s.startsWith("J");
Predicate<String> p3; // TODO
assertThat(p3.test("True")).isTrue();
assertThat(p3.test("Julia")).isTrue();
assertThat(p3.test("Java")).isFalse();
}
#LambdaHOL#Devoxx
A first example
Whatis this code doing?
Comparator<Person> cmp = new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
return p1.getLastName().compareTo(p2.getLastName());
}
};
25.
#LambdaHOL#Devoxx
A first example
Whatis this code doing?
Comparator<Person> cmp = new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
int cmp = p1.getLastName().compareTo(p2.getLastName());
if (cmp == 0) {
return p1.getFirstName().compareTo(p2.getFirstName());
} else {
return cmp;
}
}
};
26.
#LambdaHOL#Devoxx
A first example
Whatis this code doing?Comparator<Person> cmp = new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
int cmp = p1.getLastName().compareTo(p2.getLastName());
if (cmp == 0) {
cmp = p1.getFirstName().compareTo(p2.getLastName());
if (cmp == 0) {
return Integer.compare(p1.getAge(), p2.getAge());
} else {
return cmp;
}
} else {
return cmp;
}
}
};
27.
#LambdaHOL#Devoxx
A first example
Whatis this code doing?Comparator<Person> cmp = new Comparator<Person>() {
@Override
public int compare(Person p1, Person p2) {
int cmp = p1.getLastName().compareTo(p2.getLastName());
if (cmp == 0) {
cmp = p1.getFirstName().compareTo(p2.getFirstName());
if (cmp == 0) {
return Integer.compare(p1.getAge(), p2.getAge());
} else {
return cmp;
}
} else {
return cmp;
}
}
};
28.
#LambdaHOL#Devoxx
A first example
Whatis this code doing?
Comparator<Person> cmp = Comparator.comparing(Person::getLastName)
.thenComparing(Person::getFirstName)
.thenComparing(Person::getAge);
29.
#LambdaHOL#Devoxx
1st example
A comparatorthat puts null values at the end
Person michael = new Person("Michael", "Jackson", 51);
Person rod = new Person("Rod", "Stewart", 71);
Person paul = new Person("Paul", "McCartney", 74);
Person mick = new Person("Mick", "Jagger", 73);
Person jermaine = new Person("Jermaine", "Jackson", 61);
@Test
public void comparator_1() {
Comparator<Person> cmp = null; // TODO
assertThat(cmp.compare(michael, rod)).isLessThan(0);
assertThat(cmp.compare(paul, paul)).isEqualTo(0);
assertThat(cmp.compare(michael, jermaine)).isGreaterThan(0);
assertThat(cmp.compare(mick, null)).isLessThan(0);
assertThat(cmp.compare(null, mick)).isGreaterThan(0);
}
#LambdaHOL#Devoxx
A Currency Converter
…write the following currency converter:
LocalDate date = ...;
CurrencyConverter plnToAud =
CurrencyConverter.of(date)
.from("PLN")
.to("AUD");
float pln = ...;
float aud = plnToAud.convert(pln);
33.
#LambdaHOL#Devoxx
A Validator
Given thefollowing bean
public class Person {
private String lastName ;
private int age ;
// getters, setters, constructeurs
}
34.
#LambdaHOL#Devoxx
A Validator
Implement thefollowing pattern
If the user is not valid: get() throws an exception, with all
the exceptions of each validator in the suppressed
exceptions
Validator<Person> validator = Validator.
.firstValidate(p -> p.getName() == null, "name is null")
.thenValidate(p -> p.getAge() < 0, "age is negative")
.thenValidate(p -> p.getAge() > 150, "age is greater than
150");
person = validator.validate(person).get();
35.
#LambdaHOL#Devoxx
A Validator
If theuser is not valid: get() throws an exception, with all
the exceptions of each validator in the suppressed
exceptions
Validator<Person> validator =
Validator
.firstValidate(p -> p.getName() == null, "name is null")
.thenValidate(p -> p.getAge() < 0, "age is negative")
.thenValidate(p -> p.getAge() > 150, "age is greater than 150");
person = validator.validate(person).get();
36.
#Devoxx
Don’t miss the2nd day:
1) More functional
programming!
2) Stream, reduction
3) Collectors
Day break!