Lambdas in for-each loops
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Wed Sep 5 01:51:14 PDT 2012
>
> I've been saying that lambda expressions can be used in any context
> that expects an instance of a FI type. It would be nice to have no
> exceptions to that, if possible (are there others besides this foreach
> loop situation?).
The for-each context is not straightforward - when the compiler sees:
for (String s : exp)
it doesn't exactly expects an Iterable<String>, as exp can be either an
array or an Iterable. Howvere, even if we ruled out the array case, we
still would have the problem that the variable declaration 's'
corresponds to several potential target types (not just one) as there
might be wildcards involved. In other words, this is not a context in
which a target type is expected - things like method inference also
doesn't work here:
<E> Iterable<E> it() { ... }
for (String s : it()) //error
Type-checking for for-each loop works the other way around - first the
type of the expression is determined in isolation - if that type is some
Iterable<X> the compiler checks that X is compatible with the type of
the for each variable decl.
Of course the compiler could special case situations in which the
expression is a lambda/method reference and pass in a target type that
is Iterable<X> where X is the type of the variable, but that would feel
a bit brittle and would not scale to situations in which the lambda is
nested in i.e. a conditional expression.
Maurizio
More information about the lambda-dev
mailing list