return params.stream()
.filter(p -> key.equals(p.getKey())
.filter(p -> ! p.getValues().isEmpty())
.map(p -> p.getValues().get(0))
.findFirst()
.orElse("");
If p.getValues() is a List, you could shorten it as:
return params.stream()
.filter(p -> key.equals(p.getKey())
.flatMap(p -> p.getValues().stream())
.findFirst()
.orElse("");
If it's not important to get the first matching value and you are ok with just getting any match, replace findFirst() with findAny(). It will more clearly mark your intent and, if somebody makes the stream parallel later on, findAny() may perform better.