0

I am trying to use a lambda expression in Android Studio to filter an array

String[] a = { "s", "", "1", "", "" };
a = Arrays.stream(a).filter(s -> !s.isEmpty()).toArray(String[]::new);

I am getting an error on compilation 'Cannot resolve method stream'

enter image description here

Other Lambda expressions (say for click events) are working and I am targetting java 1.8 in my app gradle:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
    incremental = false;
}

Under File -> Project Stucture I am using the embedded JDK and even when I switch to the latest Java 8 JDK i still get the error.

Interestingly if i switch back to VERSION_1_7 then my prevously working lambda statements give a compile error.

How can I get this filter working in Android Studio?

Community
  • 1
  • 1
wal
  • 17,409
  • 8
  • 74
  • 109

1 Answers1

7

There is a difference between Java8 language features and Java8-API. Android supports only a subset of each. Lambdas are a Java8 language feature. Whereas the stream API is an API introduced in the Java8-API.

Language features are implemented by the compiler and might need some API-Support, whereas the Java-API needs to be present on the device.

This means you can use lambdas with apps having minSdkVersion < 24 but you can't use the stream API, since it is only part of the sdk for >=24.

https://developer.android.com/guide/platform/j8-jack.html#supported-features

You have the same in other "Java-technologies". Typically the Eclipse compiler can have a source compatibility of 1.8 and a target compatibility of 1.7, this would allow you to use lambdas, but not streams (when running on a java7 vm, on a java8 vm it would work)

revau.lt
  • 2,674
  • 2
  • 20
  • 31