How return null by using Stream API?

Roman Shmandrovskyi :

So, I have an ArrayList of autogenerated strings. I want to find the first element that contains some character or else if there is no one element that matches this filter, to apply another filter. In another way, I want to return null object.

So I write this lambda expression:

str.stream()
   .filter(s -> s.contains("q"))
   .findFirst()
   .orElseGet(() -> str.stream()
                       .filter(s -> s.contains("w"))
                       .findFirst()
                       .orElseGet(null))

But if there is no one element that matches this two filters I will have NullPointerException. How, can I get something like: return null?

ernest_k :

An additional, simpler approach: you can filter on strings containing q or w, then sort to move those containing q first, find first, return null if the optional is empty:

str.stream()
    .filter(s -> s.contains("q") || s.contains("w"))
    .sorted((s1, s2) -> s1.contains("q") ? -1 : 1 )
    .findFirst()
    .orElse(null);

.sorted((s1, s2) -> s1.contains("q") ? -1 : 1 ) will move the strings containing "q" first. Since the stream has been filtered only on values containing either q or w, then returning null will only happen no element is retained.

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=72196&siteId=1