2017-03-07 28 views
6

Wystarczy skonfigurować projekt przy użyciu Androida Studio 2.2.3 z językiem Java 1.8 i Android 7 (poziom API 24) próbując przetestować "nową" funkcję java 8 Stream.Jak korzystać z API Java 8 Stream w systemie Android 6.0

Oto moja Gradle plik:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 25 
    buildToolsVersion "25.0.2" 
    defaultConfig { 
     applicationId "com.example.radinator.myproject" 
     minSdkVersion 24 
     targetSdkVersion 24 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.android.support:appcompat-v7:25.2.0' 
    testCompile 'junit:junit:4.12' 
} 

Oto kod:

import java.util.stream.*; 
public class MainActivity extens Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_mainactivity); 
    } 

    void foo(){ 
     List<String> myList = Arrays.asList("one", "two", "three", "four", "five", "six"); 
     myList.stream() 
      .filter(s -> s.length() > 0) 
      .collect(Collectors.toList()) 
    } 

} 

Android Studio podkreśla linię myList.stream()... mówi mi "Usage of API documented as @since 1.8+" Gradle kompiluje wszystko, ale dlaczego ten komunikat? Myślałem, że ta funkcja została wprowadzona w Java 8 i dostępna pod Androidem API Leve 24 i wyżej?

Jak mogę rozwiązać ten bałagan?

góry dzięki

+0

Może to może pomóc (ustawienie poziomu języka modułu): http://stackoverflow.com/questions/37787079/intellij-unable-to-use-newer-java-8-classes-error-usage-of-api -documented – Kelo

+0

jeśli Android Studio miał tę opcję, to ja to zmieniłem. Niestety nie ma takiej opcji (tylko skompilowanie wersji sdk i wersji narzędzia do budowania) – Radinator

+2

Poziom API 24 = Nougat, Android 7.0-7.1.1, poziom API 23 = Marshmallow, Android 6.0 (.1) – Sartorius

Odpowiedz

8

aktualizacji 2017-04-04

Jack is deprecated, Google jest zastąpienie go czymś zwanym desugar. Jest teraz dostępny pod numerem Android Studio 2.4 preview 4 i późniejszym.

Java Dostępność funkcji języka/biblioteki nadal zależy od poziomu interfejsu API urządzenia i wersji Studio Android, więc upewnij się, że jest to double check what you can and can't use.

Aby go użyć, którą wystarczy ustawić poziom źródłowy i docelowy język Java 8.

android { 
    ... 
    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_8 
     targetCompatibility JavaVersion.VERSION_1_8 
    } 
} 

Zauważ, że jeśli używasz już retrolambda lub jack, trzeba będzie je wyłączyć za desugar do być użytym. Więcej informacji o tym, jak go używać, można znaleźć pod adresem here.

Jeszcze nie próbowałem tego sam, ponieważ wolę IntelliJ IDEA, a szybkie badania, jak go używać z IDEA nie były owocne. Zaktualizuję tę odpowiedź ponownie, gdy tylko wymyślę, jak go użyć w IDEA.

Old odpowiedź

Niektóre funkcje Java 8 językowe są dostępne podczas korzystania Jack kompilatora.

włączyć Jack, edytuj build.gradle jak tak

android { 
    ... 
    defaultConfig { 
     ... 
     jackOptions { 
      enabled true 
     } 
    } 
    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_8 
     targetCompatibility JavaVersion.VERSION_1_8 
    } 
} 

Więcej informacji można znaleźć here

Jednak chciałbym dodać, że miałem bardzo złe doświadczenia z gniazda tak daleko, zwłaszcza podczas debugowania. Zalecam używanie teraz streamsupport i retrolambda zamiast tego , dopóki nie zostanie wydana siostra Jacka Jill.

+3

Jack jest przestarzały od przyszłego miesiąca. –

+2

podobno, https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html ... cóż, retrolambda na ratunek ... choć wciąż jest nadzieja – Zharf

+1

I Spróbuję pamiętać o aktualizacji tej odpowiedzi, gdy zobaczę nowe rzeczy – Zharf