преобразовать для каждого в поток с if else - PullRequest
3 голосов
/ 27 мая 2020

у меня есть сценарий кода, в котором я конвертирую для каждого в поток, но я не уверен, что это правильный подход, которому я следую

Это для каждого l oop:

List<ClassA> list=getList(); //Contains object of type ClassA
int a=0; int b=0; int c=0;
for(ClassA a: list) {
    String response=checkRespone(a.getId());
    if(reponse.equals("x"))  ++a;
    else if(reponse.equals("y")) ++b;
    else ++c;
}

Чтобы преобразовать его в поток, я написал это. Есть ли лучший способ написать это?

AtomicInteger a = new AtomicInteger(0);
AtomicInteger b = new AtomicInteger(0);
AtomicInteger c = new AtomicInteger(0);

list.stream().forEach(ClassA->{if(checkRespone(a.getId()).equals("x")) {a.set(a.get()+1);} else if (checkRespone(a.getId()).equals("y")) {
    b.set(b.get()+1);
} else {
    c.set(c.get()+1);
}});

1 Ответ

6 голосов
/ 27 мая 2020

Если вы действительно хотите выполнить это функционально, вы можете попробовать grouping коллекторы. Кроме того, вы можете избежать повторения значений, чтобы найти их sum, если вы склонны использовать размер исходного списка, чтобы найти оставшееся количество для переменной c.

Map<String, Long> countingResponse = list.stream()
        .map(clz -> checkRespone(clz.getId()))
        .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
int a = countingResponse.getOrDefault("x", 0L).intValue();
int b = countingResponse.getOrDefault("y", 0L).intValue();
int c = list.size() - (a + b);
...