Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Optionally getting field

I have a class structure like this:

public class Foo {
    private FooB foob;

    public Optional<FooB> getFoob() {
        return Optional.ofNullable(foob);
    }
}

public class FooB {
    private int valA;

    public int getValA() {
        return valA;
    }
}

My objective is to call the get method for fooB and then check to see if it's present. If it is present then return the valA property, if it doesn't then just return null. So something like this:

Integer valA = foo.getFoob().ifPresent(getValA()).orElse(null);

Of course this isn't proper Java 8 optional syntax but that's my "psuedo code". Is there any way to achieve this in Java 8 with 1 line?

like image 731
Richard Avatar asked Jun 22 '16 13:06

Richard


2 Answers

What you are describing is the method Optional.map:

Integer valA = foo.getFoob().map(foo -> foo.getValA()).orElse(null);

map lets you transform the value inside an Optional with a function if the value is present, and returns an empty the optional if the value in not present.

Note also that you can return null from the mapping function, in which case the result will be Optional.empty().

like image 156
Lii Avatar answered Oct 11 '22 01:10

Lii


Why you dont add a getValue methode to the class Foo? This would be a kind of delegation.

public class Foo {
   ...
   public Integer getValue() {
       if (foob == null) {
          return null;
       }
       return foob.getValA();
   }
}
like image 39
Kevin Wallis Avatar answered Oct 11 '22 01:10

Kevin Wallis