I come across this syntax in Java

```
ImmutableMap.Builder<String, Object> builder = ImmutableMap.<String, Object>builder()

```

On the left hand side I can understand the Builder takes two types String and Object. But the right hand sytax is confusing to me. 
As I read it

1. ImmutableMap.XXX // XXX should be property or a static method.
2. Well, I find `Immutable.<String, Object>` // How come XXX is now a `<String, Object>`, a generic type?
3. Next, `Immutable.<String, Object>builder();` // Now, is this a builder() return type? That it will return `Immutable.<String, Object>`. How is builder behaving like a standalone function now.

You can see that I am bit stumped by this syntax in Java. How do I best understand these kind of syntaxes?

A simpler example being, in a unit test, I had to do.

```
expect(mockDao.findId(role, name)).andReturn(Optional.<Long>absent());

```

absent() is a generic static method of Optinal and I would understand if it were Optional.absent(), but making it `Optional.<Long>absent()` instead of `Optional<Long> Optional.absent()` confuses me a bit.

Any sources that I should look into to clarify my understanding of this concept?