filter method

Optional<T> filter([
  1. bool predicate(
    1. T
    )?
])

If a value is present, and the value matches the given predicate, returns an Optional describing the value, otherwise returns an empty Optional.

predicate the predicate to apply to a value, if present

Returns an Optional describing the value of this Optional, if a value is present and the value matches the given predicate, otherwise an empty Optional.

Throws InvalidArgumentException if the predicate is null.

Example

Optional<String> name = Optional.of("Grace");
Optional<String> empty = Optional.empty();

// Filter based on length
Optional<String> longName = name.filter((s) => s.length > 3);
print(longName.isPresent()); // true (Grace has 5 characters)

Optional<String> shortName = name.filter((s) => s.length < 3);
print(shortName.isEmpty()); // true (Grace is not less than 3 characters)

// Empty optionals remain empty after filtering
Optional<String> stillEmpty = empty.filter((s) => s.isNotEmpty);
print(stillEmpty.isEmpty()); // true

// Chain with other operations
Optional<String> result = Optional.of("hello world")
    .filter((s) => s.contains("world"))
    .map((s) => s.toUpperCase());
print(result.get()); // "HELLO WORLD"

Implementation

Optional<T> filter([bool Function(T)? predicate]) {
  if (predicate == null) {
    throw InvalidArgumentException('predicate cannot be null');
  }
  if (isEmpty()) {
    return this;
  } else {
    return predicate(_value as T) ? this : empty<T>();
  }
}