<div dir="ltr">I wanted to propose a pretty simple way of making the lambdas serializable by default that I stumbled upon while working on another issue.<div><br></div><div>I noticed that in the method resolution of the compiler it does some nice things [1].  To be more specific when you have 2 methods with the same name but vary by argument types, it will attempt to pick the most &quot;specific&quot; one.  Specific in this case you can think of if I can cast one argument type to the other but it can&#39;t be cast to this type, then this one is most specific.</div><div><br></div><div>Here is an example, given the following class<br><br></div><div>interface SerializableFunction&lt;T, R&gt; extends Serializable, Function&lt;T, R&gt;<br></div><div><br></div><div>The stream interface already defines:<br></div><div><br></div><div>   Stream map(Function&lt;? super T, ? extends R&gt; mapper);</div><div><br></div><div>But we could add this to the CacheStream interface<br></div><div><br></div><div>  CacheStream map(SerializableFunction&lt;? super T, ? extends R&gt; mapper);</div><div><br></div><div>In this case you have 2 different map methods accessible from your CacheStream instance.  When passing a lambda the Java compiler will automatically choose the most specific one (in this case the SerializableFunction one since Function can&#39;t be cast to SerializableFunction).  This will then make the lambda automatically Serializable.  In this way nothing special has to be done (ie. explicit cast) to make the instance Serializable.<br><br></div><div>This allows anyone using our Cache interface to immediately get lambdas that are Serializable when using Streams.<br><br></div><div>The main problem however would be ambiguity because the Serialization would only be applied assuming you are using a defined class of CacheStream etc.  Also this means there are 2 methods (but that seems fine to me), so it could cause a bit of confusion.  The non serialization method is still helpful if people want to their own Externalizer, since their implementation doesn&#39;t have to implement Serializable then.<br><br></div><div>What do you guys think?  It seems like a decent compromise to me.<br></div><div><br></div><div> - Will<br></div><div><br></div><div><br></div><div><br></div><div><br></div><div><br></div><div>[1] <a href="https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5" target="_blank">https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.12.2.5</a><br><div><br></div><div><br></div></div></div>