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.StreamSupport
API 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
'programing' 카테고리의 다른 글
Vue $emit 인수를 이미 인수가 있는 함수에 전달 (0) | 2022.09.20 |
---|---|
jQuery Ajax POST 예시(PHP 사용) (0) | 2022.09.20 |
컴포넌트를 소품으로 전달하여 Vue의 자 컴포넌트에 사용할 수 있습니까? (0) | 2022.09.20 |
Java 프로젝트에는 어떤 코드 분석 도구를 사용하고 있습니까? (0) | 2022.09.20 |
삽입...어디에서 중복된 키를 갱신할 때? (0) | 2022.09.20 |