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;
    }
    List<@NonNull String> unsafeSingleton(@Nullable String in) {
        List<@NonNull String> result = new ArrayList<>();
        result.add(in);
        return result;
    }
}