Java 8 Features

 Java 8  feature list




1. Lambda Expressions

java
List<String> names = Arrays.asList("Ravi", "Anil", "Viswa");
names.forEach(n -> System.out.println(n));

👉 Useful for concise functional programming.

2. Method References

java
names.forEach(System.out::println);

👉 Cleaner syntax when reusing existing methods.

3. Default & Static Methods in Interfaces

java
interface Vehicle {
    default void start() { System.out.println("Starting..."); }
    static void info() { System.out.println("Vehicle info"); }
}

👉 Allows evolving APIs without breaking old code.

4. Stream API

java
List<Integer> nums = Arrays.asList(1,2,3,4,5);
int sum = nums.stream().filter(n -> n%2==0).mapToInt(n->n).sum();
System.out.println(sum); // 6

👉 Declarative data processing.

5. Optional Class

java
Optional<String> name = Optional.ofNullable(null);
System.out.println(name.orElse("Default")); // Default

👉 Avoids NullPointerException.

6. New Date/Time API

java
LocalDate today = LocalDate.now();
LocalDate nextWeek = today.plusWeeks(1);
System.out.println(nextWeek);

👉 Immutable, thread-safe time handling.

7. CompletableFuture

java
CompletableFuture.supplyAsync(() -> "Hello")
                 .thenAccept(System.out::println);

👉 Asynchronous programming made easy.

8. Nashorn JavaScript Engine

java
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval("print('Hello from JS')");

👉 Embeds JavaScript in JVM.

9. Base64 Encoding/Decoding

java
String encoded = Base64.getEncoder().encodeToString("data".getBytes());
System.out.println(encoded);

👉 Secure data transmission.

10. Parallel Array Sorting

java
int[] arr = {5,3,8,1};
Arrays.parallelSort(arr);
System.out.println(Arrays.toString(arr)); // [1,3,5,8]

👉 Faster sorting on large arrays.

11. Repeating Annotations

java
@Schedule(day="Monday")
@Schedule(day="Friday")
class Meeting {}

👉 Apply same annotation multiple times.

12. Type Annotations

java
List<@NonNull String> list = new ArrayList<>();

👉 More precise type checking.

13. Parameter Name Reflection

java
Method m = MyClass.class.getMethod("myMethod", String.class);
for (Parameter p : m.getParameters()) {
    System.out.println(p.getName());
}

👉 Useful for frameworks and debugging.

Java Stream API : Java 8 Feature

📌 Stream API Quick Reference Sheet





MethodTypeFunctional InterfacePurposeExample
forEach()TerminalConsumer<T>Perform an action on each elementlist.stream().forEach(System.out::println);
filter()IntermediatePredicate<T>Keep only elements that match a conditionlist.stream().filter(n -> n > 10);
map()IntermediateFunction<T,R>Transform each elementlist.stream().map(String::length);
flatMap()IntermediateFunction<T,Stream<R>>Flatten nested structureslist.stream().flatMap(List::stream);
sorted()IntermediateComparator<T>Sort elementslist.stream().sorted();
distinct()Intermediate—Remove duplicateslist.stream().distinct();
limit()Intermediate—Restrict to first n elementslist.stream().limit(5);
skip()Intermediate—Skip first n elementslist.stream().skip(3);
peek()IntermediateConsumer<T>Debug/log elementslist.stream().peek(System.out::println);
reduce()TerminalBinaryOperator<T>Combine into single resultlist.stream().reduce(0, Integer::sum);
collect()TerminalCollector<T,A,R>Gather results into a collectionlist.stream().collect(Collectors.toList());
anyMatch() / allMatch() / noneMatch()TerminalPredicate<T>Check conditions across elementslist.stream().anyMatch(n -> n > 0);
findFirst() / findAny()Terminal—Retrieve one elementlist.stream().findFirst();

forEach in Stream : The forEach() method in Java’s Stream API is used to iterate over each element of the stream and perform an action on it. It’s a terminal operation, meaning once you call forEach(), the stream pipeline is consumed and cannot be reused.


List<String> names = Arrays.asList("Alice", "Bob", "Charlie");

names.stream()

     .forEach(System.out::println); // Consumer


filter Method : The filter() method in Java’s Stream API is used to select elements that match a given condition. It’s an intermediate operation, meaning it transforms the stream but doesn’t consume it


List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);

List<Integer> evens = numbers.stream()

                             .filter(n -> n % 2 == 0) // Predicate

                             .collect(Collectors.toList());


System.out.println(evens);


Filter method on Strings as below

List<String> names = Arrays.asList("Ravi", "Anil", "Viswa", "Rajesh", "Sita");

List<String> longNames = names.stream()
                              .filter(name -> name.length() > 4)
                              .collect(Collectors.toList());

System.out.println(longNames);

findFirst,findAny,Max,min & reduce will have optiona as return type to avoid null pointer exception





Comments