import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;

import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;

public class Generics {

    List<@Nullable String> safeFilter(List<@NonNull String> in,
                                Predicate<@NonNull String> pred) {
        List<@Nullable String> result = new ArrayList<>();
        for (String string : in) {
            if (pred.test(string))
                result.add(string);
            else
                result.add(null);
        }
        return result;
    }
    boolean unsafePredicateCall(List<@Nullable String> in,
                                Predicate<@NonNull String> pred) {
        for (String string : in) {
            if (pred.test(string))
                return true;
        }
        return false;
    }
}