1. Common mistakes when using functional Java include doing too much in a single lambda expression, mutating objects within streams which are immutable, and overusing forEach which should be avoided.
2. When working with optionals, it is important to unpack them before use rather than accessing the value directly, and methods like orElse, orElseGet, and orElseThrow can be used to define alternative flows.
3. When working with streams of optionals, flatMap can be used to flatten the stream.