Answer
Java 8 Stream API
A Stream is a sequence of elements that can be processed in a functional, declarative way. Streams do NOT store data — they process elements from a source (Collection, Array, etc.).
Creating Streams
Java
// From Collection
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Stream<String> stream1 = names.stream();
// From Array
int[] arr = {1, 2, 3, 4, 5};
IntStream stream2 = Arrays.stream(arr);
// From values
Stream<String> stream3 = Stream.of("X", "Y", "Z");
// Infinite stream
Stream<Integer> infinite = Stream.iterate(0, n -> n + 2); // 0, 2, 4, 6...
Intermediate Operations (return a new Stream — lazy)
Java
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Anna", "David");
// filter — keep elements matching condition
List<String> aNames = names.stream()
.filter(n -> n.startsWith("A"))
.collect(Collectors.toList());
// ["Alice", "Anna"]
// map — transform each element
List<Integer> lengths = names.stream()
.map(String::length)
.collect(Collectors.toList());
// [5, 3, 7, 4, 5]
// sorted — sort elements
List<String> sorted = names.stream()
.sorted()
.collect(Collectors.toList());
// ["Alice", "Anna", "Bob", "Charlie", "David"]
// distinct — remove duplicates
List<Integer> unique = Arrays.asList(1, 2, 2, 3, 3, 3).stream()
.distinct()
.collect(Collectors.toList());
// [1, 2, 3]
// limit / skip
names.stream().limit(3) // first 3
names.stream().skip(2) // skip first 2
Terminal Operations (trigger execution)
Java
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
// collect — gather into collection
List<Integer> evens = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
// [2, 4, 6, 8, 10]
// count
long count = numbers.stream().filter(n -> n > 5).count(); // 5
// findFirst / findAny
Optional<Integer> first = numbers.stream()
.filter(n -> n > 3)
.findFirst();
first.ifPresent(System.out::println); // 4
// min / max
Optional<Integer> max = numbers.stream().max(Integer::compareTo); // 10
// reduce — combine all elements
int sum = numbers.stream().reduce(0, Integer::sum); // 55
// forEach
numbers.stream().filter(n -> n % 2 == 0).forEach(System.out::println);
// anyMatch / allMatch / noneMatch
boolean anyEven = numbers.stream().anyMatch(n -> n % 2 == 0); // true
boolean allPositive = numbers.stream().allMatch(n -> n > 0); // true
boolean noneNeg = numbers.stream().noneMatch(n -> n < 0); // true
Real Example — Employee Processing
Java
List<Employee> employees = getEmployees();
// Find all senior SDETs earning > 80k, sorted by salary descending
List<Employee> topSDETs = employees.stream()
.filter(e -> e.getRole().equals("SDET"))
.filter(e -> e.getSalary() > 80000)
.sorted(Comparator.comparingDouble(Employee::getSalary).reversed())
.limit(5)
.collect(Collectors.toList());
// Group by department
Map<String, List<Employee>> byDept = employees.stream()
.collect(Collectors.groupingBy(Employee::getDepartment));
// Average salary
OptionalDouble avgSalary = employees.stream()
.mapToDouble(Employee::getSalary)
.average();
In Automation Testing
Java
// Get all visible text from a list of elements
List<String> menuItems = driver.findElements(By.cssSelector(".nav-item"))
.stream()
.filter(WebElement::isDisplayed)
.map(WebElement::getText)
.collect(Collectors.toList());
// Check if expected option exists in dropdown
boolean hasOption = driver.findElements(By.tagName("option"))
.stream()
.map(WebElement::getText)
.anyMatch(text -> text.equals("New York"));
