programing

Android API < 24에서 Java 8 Stream API를 사용할 수 있습니까?

kingscode 2022. 9. 20. 21:51
반응형

Android API < 24에서 Java 8 Stream API를 사용할 수 있습니까?

여기서 이 을 읽었어요.그러나 minSdkVersion < 24에서는 다음과 같은 Java 8 Stream API 기능을 포함하는 코드를 실행할 수 없습니다.

List<Car> newCars = cars.stream()
                        .filter(s -> s.getColor().equals("red"))
                        .collect(Collectors.toList());

오류 메시지로 인해 실행되지 않습니다.

콜에는 API 레벨 24(현재 최소값은 15):java.util이 필요합니다.컬렉션 #스트림

그래서 해결책을 아는 사람이 있나요?

[오리지널 답]

Java8 스트림은 API 수준 < 24에서는 사용할 수 없습니다.

단, 스트림 기능의 일부를 백포트하는 라이브러리가 있습니다.

https://github.com/aNNiMON/Lightweight-Stream-API

https://github.com/konmik/solid

https://sourceforge.net/projects/streamsupport/ (@sartorius 댓글에 기재)

[업데이트 k3b 2019-05-23]

https://github.com/retrostreams/android-retrostreams은 Streamsupport에서 파생된 것으로, Android Studio 3.x D8/desugar 툴체인의 기능을 활용하여 Jar 파일 경계를 넘어 인터페이스 기본 및 정적 방식을 사용할 수 있습니다.기타 Android-retroXXX(Completeable용) 링크도 있습니다.미래.

[에라코드 2020-07-24 업데이트]

좋은 소식입니다. 이제 최소 API 레벨 없이도 Java 8 Stream API 을 사용할 수 있습니다.

DexGuard 릴리즈 8.2 이후 Java 8 streams API를 Android 디바이스 < API level 24에서도 사용할 수 있게 되었습니다.그러기 위해서는 streamsupport 라이브러리를 포함해야 합니다.DexGuard는 모든 Java 8 스트림 API 호출을 제공된 라이브러리로 변환합니다.추가 처리가 필요하지 않으며 개발자는 제공된 Java 8 streams API를 사용하여 간단히 코드를 작성할 수 있습니다.의존관계도 자동으로 번역되므로 Java 8 기능을 탑재한 라이브러리를 Android 개발에도 사용할 수 있습니다.

이 기능은 가까운 장래에 ProGuard에도 탑재될 예정입니다.

편집: 이미 베타 버전이 존재하는 Proguard 6.1.0은 Java 8 스트림 및 시간 API 백포트를 지원합니다.

네, 그렇습니다!AGP 4.0.0부터는 Stream API 및 기타 Java 8+ API(예: )를 사용할 수 있습니다.

의 Build.gradle에 필요한 최소한의 변경:

android {
  compileOptions {
    // Flag to enable support for the new language APIs
    coreLibraryDesugaringEnabled true
  }
}

dependencies {
  coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.9'
}

파티에 조금 늦을지도 모르지만 방금 봤는데java8.util.stream.StreamSupportAPI 24보다 먼저 동일한 기능 프로그래밍 방식을 실행할 수 있습니다.를 들어 web3j입니다.

StreamSupport.stream(transactionReceipt.getLogs())
            .map(log -> extractEventParameters(event, log))
            .filter(Objects::nonNull)
            .collect(Collectors.toList());

프로젝트가 다음가지를 모두 지원하는 경우 Java 코드에서 Collections를 통해 Kotlin의 확장자를 정적으로 사용하는 것이 좋습니다.

List<Car> newCars = CollectionsKt.filter(cars, s -> s.getColor().equals("red"));

일일도 입니다..map,.reduce,.first ...,개요

인터페이스를 만듭니다.

public interface Pre<T,R> {
            R get(T item);
        }

필터 메서드를 만듭니다.

public static  <T> List<T> Filter(List<T> list, Pre<T,Boolean> pre) {

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N)
        {
            return list.stream().filter(p -> pre.get(p)).collect(Collectors.toList());
        }
        else
        {
            List<T> col = new ArrayList<T>();
            for (int i = 0 ; i < list.size() ; i++)
                if (pre.get(list.get(i)))
                    col.add(list.get(i));
            return col;
        }
    }

코드 사용

    public static class model {
            public String Name;
        }
List<model> models = new ArrayList<>();
            ...
            List<model> filtermodels = Filter(models,p-> p.Name.equals("filter"));

언급URL : https://stackoverflow.com/questions/39515035/is-it-possible-to-use-the-java-8-stream-api-on-android-api-24

반응형