-
Notifications
You must be signed in to change notification settings - Fork 63
Expand file tree
/
Copy pathFunctionCombinationExercise.java
More file actions
87 lines (64 loc) · 3.62 KB
/
FunctionCombinationExercise.java
File metadata and controls
87 lines (64 loc) · 3.62 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
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)));
}
// negate1: (Person -> boolean) -> (Person -> boolean)
private Predicate<Person> negate1(Predicate<Person> test) {
return p -> !test.test(p);
}
// 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)));
}
// negate: (T -> boolean) -> (T -> boolean)
private <T> Predicate<T> negate(Predicate<T> test) {
return T -> !test.test(T);
}
// and: (T -> boolean, T -> boolean) -> (T -> boolean)
private <T> Predicate<T> and(Predicate<T> t1, Predicate<T> t2) {
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 = validateFirstName.and(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)));
}
}