Tutaj używam strumienia Javaparallel do iterowania listy i wywoływania wywołania REST z każdym elementem listy jako danych wejściowych. Muszę dodać wszystkie wyniki wywołania REST do kolekcji, dla której używam ArrayList
. Kod podany poniżej działa dobrze, z wyjątkiem tego, że niezwiązane z wątkami bezpieczeństwo tablicy ArrayList spowodowałoby niepoprawne wyniki, a dodanie wymaganej synchronizacji spowodowałoby rywalizację, podważając korzyść równoległości.Java 8 parallelStream dla współbieżnej bazy danych/wywołania REST
Czy ktoś może zaproponować mi odpowiedni sposób wykorzystania równoległego strumienia w mojej sprawie.
public void myMethod() {
List<List<String>> partitions = getInputData();
final List<String> allResult = new ArrayList<String>();
partitions.parallelStream().forEach(serverList -> callRestAPI(serverList, allResult);
}
private void callRestAPI(List<String> serverList, List<String> allResult) {
List<String> result = //Do a REST call.
allResult.addAll(result);
}
Myślę, że w szczególności aspekt * funkcjonalny * jest pouczający –
Nie powinien ostatnią linią być '.collect (Collectors.toList());' – Zeeshan
Założyłem 'import static java.util.stream.Collectors.toList ; '... – assylias