-
Notifications
You must be signed in to change notification settings - Fork 63
Expand file tree
/
Copy pathFunctionCombinationExercise.java
More file actions
93 lines (70 loc) · 3.7 KB
/
FunctionCombinationExercise.java
File metadata and controls
93 lines (70 loc) · 3.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package lambda.part2.exercise;
import data.Person;
import org.junit.Test;
import java.util.function.Predicate;
import static org.junit.Assert.assertEquals;
public class FunctionCombinationExercise {
@Test
public void personHasNotEmptyLastNameAndFirstName0() {
// Person -> boolean
final Predicate<Person> validate = p -> !p.getFirstName().isEmpty() && !p.getLastName().isEmpty();
assertEquals(true, validate.test(new Person("a", "b", 0)));
assertEquals(false, validate.test(new Person("", "b", 0)));
assertEquals(false, validate.test(new Person("a", "", 0)));
}
// TODO
// negate1: (Person -> boolean) -> (Person -> boolean)
private Predicate<Person> negate1(Predicate<Person> t) {
return p -> !t.test(p);
}
// TODO
// validateFirstNameAndLastName: (Person -> boolean, Person -> boolean) -> (Person -> boolean)
private Predicate<Person> validateFirstNameAndLastName(Predicate<Person> t1, Predicate<Person> t2) {
return p -> t1.test(p) && t2.test(p);
}
@Test
public void personHasNotEmptyLastNameAndFirstName1() {
final Predicate<Person> hasEmptyFirstName = p -> p.getFirstName().isEmpty();
final Predicate<Person> hasEmptyLastName = p -> p.getLastName().isEmpty();
final Predicate<Person> validateFirstName = negate1(hasEmptyFirstName);
final Predicate<Person> validateLastName = negate1(hasEmptyLastName);
final Predicate<Person> validate = validateFirstNameAndLastName(validateFirstName, validateLastName);
assertEquals(true, validate.test(new Person("a", "b", 0)));
assertEquals(false, validate.test(new Person("", "b", 0)));
assertEquals(false, validate.test(new Person("a", "", 0)));
}
// TODO
// negate: (T -> boolean) -> (T -> boolean)
private <T> Predicate<T> negate(Predicate<T> test) {
// TODO
return t -> !test.test(t);
}
// TODO
// and: (T -> boolean, T -> boolean) -> (T -> boolean)
private <T> Predicate<T> and(Predicate<T> t1, Predicate<T> t2) {
// TODO
return t -> t1.test(t) && t2.test(t);
}
@Test
public void personHasNotEmptyLastNameAndFirstName2() {
final Predicate<Person> hasEmptyFirstName = p -> p.getFirstName().isEmpty();
final Predicate<Person> hasEmptyLastName = p -> p.getLastName().isEmpty();
final Predicate<Person> validateFirstName = negate(hasEmptyFirstName); // TODO use negate
final Predicate<Person> validateLastName = negate(hasEmptyLastName); // TODO use negate
final Predicate<Person> validate = and(validateFirstName,validateLastName); // TODO use and
assertEquals(true, validate.test(new Person("a", "b", 0)));
assertEquals(false, validate.test(new Person("", "b", 0)));
assertEquals(false, validate.test(new Person("a", "", 0)));
}
@Test
public void personHasNotEmptyLastNameAndFirstName3() {
final Predicate<Person> hasEmptyFirstName = p -> p.getFirstName().isEmpty();
final Predicate<Person> hasEmptyLastName = p -> p.getLastName().isEmpty();
final Predicate<Person> validateFirstName = hasEmptyFirstName.negate(); // TODO use Predicate::negate
final Predicate<Person> validateLastName = hasEmptyLastName.negate(); // TODO use Predicate::negate
final Predicate<Person> validate = validateFirstName.and(validateLastName); // TODO use Predicate::and
assertEquals(true, validate.test(new Person("a", "b", 0)));
assertEquals(false, validate.test(new Person("", "b", 0)));
assertEquals(false, validate.test(new Person("a", "", 0)));
}
}