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.Collection # stream
그래서 누군가가 해결책을 알고 있습니까?
API 레벨 <24에서는 Java8 스트림을 사용할 수 없습니다.
그러나 일부 스트림 기능을 백 포트하는 일부 라이브러리가 있습니다.
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 는 Jar 파일 경계에서 인터페이스 기본 및 정적 메서드를 사용하는 Android Studio 3.x D8 / desugar 도구 모음의 기능을 활용하는 streamsupport의 스핀 오프입니다. CompletableFuture에 대한 다른 android-retroXXX에 대한 링크도 있습니다.
DexGuard 8.2 릴리스부터는 API 레벨 24 미만의 Android 장치에서도 Java 8 스트림 API를 사용할 수 있습니다.이를 위해서는 streamsupport 라이브러리 를 포함해야 하며 DexGuard는 모든 Java 8 스트림 API 호출을 제공된 도서관. 추가 처리가 필요하지 않으며 개발자는 제공된 Java 8 스트림 API를 사용하여 간단히 코딩 할 수 있습니다. 종속성도 자동으로 번역되므로 Android 개발에도 Java 8 기능이있는 라이브러리를 사용할 수 있습니다.
이 기능은 가까운 시일 내에 ProGuard에도 포함될 예정입니다. 계속 지켜봐 주시기 바랍니다.
편집 : 이미 베타 버전이있는 Proguard 6.1.0은 Java 8 스트림 및 시간 API 백 포팅을 지원합니다.
파티에 조금 늦을 수도 있지만, 사용 java8.util.stream.StreamSupport
하면 동일한 기능적 프로그래밍 접근 방식을 실행하고 Api 24 이전에 사용할 수 있음을 방금 보았습니다 . 예 : web3j에서 가져옴-
StreamSupport.stream(transactionReceipt.getLogs())
.map(log -> extractEventParameters(event, log))
.filter(Objects::nonNull)
.collect(Collectors.toList());
인터페이스를 만듭니다.
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"));
'Programing' 카테고리의 다른 글
019가 JavaScript 구문 오류가 아닌 이유는 무엇입니까? (0) | 2020.10.13 |
---|---|
URL 내부의 이중 이스케이프 시퀀스 : 요청 필터링 모듈은 이중 이스케이프 시퀀스를 포함하는 요청을 거부하도록 구성됩니다. (0) | 2020.10.13 |
Xcode 6에서 "일치하는 서명 자산을 찾거나 생성하지 못했습니다"라는 오류가 발생하는 이유는 무엇입니까? (0) | 2020.10.13 |
server.xml 또는 context.xml에서 데이터베이스 연결 속성을 설정해야합니까? (0) | 2020.10.13 |
: 터치 CSS 의사 클래스 또는 비슷한 것? (0) | 2020.10.13 |