Newer
Older
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
package solutions;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.DoublePredicate;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;
import org.junit.Ignore;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
* This set of exercises is about lambdas and method references.
* You will write a lambda or method reference corresponding to
* each of several different functional interfaces. Each exercise
* is named after the functional interface intended to be used
* as the solution.
*/
public class A_LambdasAndMethodReferences {
@Test
public void a01predicate() {
// TODO: write a lambda expression that is a predicate
// that tests whether a string is longer than four characters.
//UNCOMMENT//Predicate<String> pred = null;
//BEGINREMOVE
Predicate<String> pred = s -> s.length() > 4;
//ENDREMOVE
assertTrue(pred.test("abcde"));
assertFalse(pred.test("abcd"));
}
@Test
public void a02predicate() {
// TODO: write a lambda expression that is a predicate
// that tests whether a string is empty
//UNCOMMENT//Predicate<String> pred = null;
//BEGINREMOVE
Predicate<String> pred = s -> s.isEmpty();
//ENDREMOVE
assertTrue(pred.test(""));
assertFalse(pred.test("a"));
}
@Test
public void a03predicate() {
// TODO: write a method reference that is a predicate
// that tests whether a string is empty
//UNCOMMENT//Predicate<String> pred = null;
//BEGINREMOVE
Predicate<String> pred = String::isEmpty;
//ENDREMOVE
assertTrue(pred.test(""));
assertFalse(pred.test("a"));
}
@Test
public void a04function() {
// TODO: write a lambda expression that wraps the given
// string in parentheses.
//UNCOMMENT//Function<String, String> func = null;
//BEGINREMOVE
Function<String, String> func = s -> "(" + s + ")";
//ENDREMOVE
assertEquals("(abc)", func.apply("abc"));
}
@Test
public void a05function() {
// TODO: write a lambda expression that converts the
// given string to upper case.
//UNCOMMENT//Function<String, String> func = null;
//BEGINREMOVE
Function<String, String> func = s -> s.toUpperCase();
//ENDREMOVE
assertEquals("ABC", func.apply("abc"));
}
@Test
public void a06function() {
// TODO: write a method reference that converts the
// given string to upper case.
//UNCOMMENT//Function<String, String> func = null;
//BEGINREMOVE
Function<String, String> func = String::toUpperCase;
//ENDREMOVE
assertEquals("ABC", func.apply("abc"));
}
@Test
public void a07consumer() {
// TODO: write a lambda expression that appends the
// string "abc" to the given StringBuilder.
//UNCOMMENT//Consumer<StringBuilder> cons = null;
//BEGINREMOVE
Consumer<StringBuilder> cons = sb -> sb.append("abc");
//ENDREMOVE
StringBuilder sb = new StringBuilder("xyz");
cons.accept(sb);
assertEquals("xyzabc", sb.toString());
}
@Test
public void a08consumer() {
// TODO: write a lambda expression that clears the given list.
//UNCOMMENT//Consumer<List<String>> cons = null;
//BEGINREMOVE
Consumer<List<String>> cons = list -> list.clear();
//ENDREMOVE
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
cons.accept(list);
assertTrue(list.isEmpty());
}
@Test
public void a09consumer() {
// TODO: write a method reference that clears the given list.
//UNCOMMENT//Consumer<List<String>> cons = null;
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
//BEGINREMOVE
Consumer<List<String>> cons = List::clear;
//ENDREMOVE
List<String> list = new ArrayList<>(Arrays.asList("a", "b", "c"));
cons.accept(list);
assertTrue(list.isEmpty());
}
@Test
public void a10supplier() {
// TODO: write a lambda expression that returns a new StringBuilder
// containing the string "abc".
Supplier<StringBuilder> sup = () -> new StringBuilder("abc");
assertEquals("abc", sup.get().toString());
}
@Test
public void a11supplier() {
// TODO: write a lambda expression that returns a new, empty StringBuilder
//UNCOMMENT//Supplier<StringBuilder> sup = null;
//BEGINREMOVE
Supplier<StringBuilder> sup = () -> new StringBuilder();
//ENDREMOVE
assertEquals("", sup.get().toString());
}
@Test
public void a12supplier() {
// TODO: write a method reference that returns a new, empty StringBuilder
//UNCOMMENT//Supplier<StringBuilder> sup = null;
//BEGINREMOVE
Supplier<StringBuilder> sup = StringBuilder::new;
//ENDREMOVE
assertEquals("", sup.get().toString());
}
@Test
public void a13doublepredicate() {
// TODO: write a lambda expression that tests whether a double value
// is greater than 10.0.
DoublePredicate pred = d -> d > 10.0;
assertTrue(pred.test(15.0));
assertFalse(pred.test(5.0));
}
@Test
public void a14doublepredicate() {
// TODO: write a lambda expression that tests whether a double value
// is finite.
DoublePredicate pred = d -> Double.isFinite(d);
assertTrue(pred.test(0.0));
assertFalse(pred.test(Double.POSITIVE_INFINITY));
}
@Test
public void a15doublepredicate() {
// TODO: write a method reference that tests whether a double value
// is finite.
DoublePredicate pred = Double::isFinite;
assertTrue(pred.test(0.0));
assertFalse(pred.test(Double.POSITIVE_INFINITY));
}
@Test
public void a16bifunction() {
// TODO: write a lambda expression, given two strings, returns the result
// of concatenating the first, followed by the second, followed by the
// first again.
BiFunction<String, String, String> bifunc = (s1, s2) -> s1 + s2 + s1;
assertEquals("abcdefabc", bifunc.apply("abc", "def"));
}
@Test
public void a17bifunction() {
// TODO: write a lambda expression that returns the index of
// the first occurrence the second string within the first string,
// or -1 if the second string doesn't occur within the first string.
BiFunction<String, String, Integer> bifunc = (s1, s2) -> s1.indexOf(s2);
assertTrue(bifunc.apply("abcdefghi", "def") == 3);
assertTrue(bifunc.apply("abcdefghi", "xyz") == -1);
}
@Test
public void a18bifunction() {
// TODO: write a method reference that returns the index of
// the first occurrence the second string within the first string,
// or -1 if the second string doesn't occur within the first string.
BiFunction<String, String, Integer> bifunc = String::indexOf;
assertTrue(bifunc.apply("abcdefghi", "def") == 3);
assertTrue(bifunc.apply("abcdefghi", "xyz") == -1);
}
@Test
public void a19runnable() {
StringBuilder sb = new StringBuilder("abc");
String suffix = "xyz";
// TODO: write a lambda expression that appends the 'suffix'
// variable (a String) to the sb variable (a StringBuilder).
Runnable r = () -> sb.append(suffix);
r.run();
r.run();
r.run();
assertEquals("abcxyzxyzxyz", sb.toString());
}
}