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

import org.eclipse.jdt.annotation.NonNullByDefault;

@NonNullByDefault
public class Defaults {

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

    List<String> safeSingleton(String in) {
        List<String> result = new ArrayList<>();
        result.add(in);
        return result;
    }
    
    @NonNullByDefault({})
    // default is canceled for this method
    void unprotectedClient(Predicate<String> myPred, String myString) {
        List<String> myStrings = safeSingleton(myString);
        safeFilter(myStrings, myPred);    
    }
}