Lambda expressions are anonymous functions that can be used to create delegates or expression tree types. They provide a concise way to represent one method interface using an expression.
// Basic lambda syntax
(parameters) -> expression
(parameters) -> { statements; }
// Examples
() -> System.out.println("Hello World")
(x) -> x * 2
(x, y) -> x + y
(String s) -> s.length()
Lambda expressions can significantly simplify test code, especially when working with collections, event handling, and asynchronous operations.
// Traditional approach
@Test
public void testUserFiltering() {
List<User> users = getUserList();
List<User> activeUsers = new ArrayList<>();
for (User user : users) {
if (user.isActive()) {
activeUsers.add(user);
}
}
assertEquals(5, activeUsers.size());
}
// Lambda approach
@Test
public void testUserFiltering() {
List<User> users = getUserList();
long activeUserCount = users.stream()
.filter(User::isActive)
.count();
assertEquals(5, activeUserCount);
}
Java 8 provides several built-in functional interfaces in the java.util.function package:
// Predicate example
Predicate<User> isActive = user -> user.isActive();
Predicate<User> isAdmin = user -> "admin".equals(user.getRole());
// Function example
Function<User, String> getUserEmail = user -> user.getEmail();
// Consumer example
Consumer<User> printUser = user -> System.out.println(user.getName());
// Supplier example
Supplier<User> createTestUser = () -> new User("test", "test@example.com");
@Test
public void testUserValidation() {
List<User> users = getUserList();
// Check if all users have valid emails
boolean allValidEmails = users.stream()
.allMatch(user -> user.getEmail().contains("@"));
assertTrue("All users should have valid emails", allValidEmails);
// Check if any user is admin
boolean hasAdmin = users.stream()
.anyMatch(user -> "admin".equals(user.getRole()));
assertTrue("Should have at least one admin", hasAdmin);
}