I have a list of result. I need to find the passed results count. But there is a relation between some items in list. For Example. I have list like
1.0 - false
2.0 - true
3.0 - false
4.0 - true
1.1 - true
3.1 - true
Then the passed count should be 2 and not the 4. Because I want to group the list based on id (1,1.2,1.3,1.xx in to single group) and mark it as pass if all the items in the group is pass . I have tried group using groupingBy and I have got a map of my expected behavior. I can iterate the map and get the count. But I want to know is there any way I can do this simply using Java 8.
public class Main {
static class Resultx {
double id = 1;
Boolean passed = false;
public void setId(double id) {
this.id = id;
}
public double getId() {
return id;
}
public void setAsPassed() {
this.passed = true;
}
public Boolean getPassed() {
return passed;
}
@Override
public String toString() {
return getId() + " - " + getPassed();
}
}
public static void main(String[] args) {
List<Resultx> results = new ArrayList<>();
for (int i = 1; i < 5; i++) {
Resultx result = new Resultx();
result.setId(i);
if (i % 2 == 0) {
result.setAsPassed();
}
results.add(result);
}
for (int i = 1; i < 5; i += 2) {
Resultx result = new Resultx();
result.setId(i + .1);
result.setAsPassed();
results.add(result);
}
System.out.println(results.size());
results.forEach(System.out::println);
System.out.println(results.stream().filter(Resultx::getPassed).count());
System.out.println(results.stream().filter(e -> !e.getPassed()).count());
System.out.println(results.stream().collect(Collectors.groupingBy(r -> (int) (r.getId()))));
}
}
Output
Total count - 6
1.0 - false
2.0 - true
3.0 - false
4.0 - true
1.1 - true
3.1 - true
Total pass count - 4
Total fail count - 2
{1=[1.0 - false, 1.1 - true], 2=[2.0 - true], 3=[3.0 - false, 3.1 - true], 4=[4.0 - true]}
I want Overall pass count and overall fail count. which is 2 and 2