Sum of all var values which we skipped by limit function need to display as new row dummy sum user{name="Dummy" var="13.88" }

Viewed 54

output should be like below limit(5) :

User{name='T', var=100.43} 
User{name='E', var=50.10}
User{name='D', var=40.93}
User{name='C', var=30.99}
User{name='B', var=20.01}
User{name="Dummy" var="13.88"}
import java.util.Arrays; 
import java.util.List;
import java.util.stream.Collectors;

public class StreamApplication {

   static List<Vari> users = Arrays.asList(
           new Vari("C", "30.99"),
           new Vari("D", "40.93"),
           new Vari("A", "10.43"),
           new Vari("G", "1.43"),
           new Vari("T", "100.43"),
           new Vari("B", "20.01"),
           new Vari("BB", "2.01"),
           new Vari("R", "0.01"),
           new Vari("N", "0"),
           new Vari("E", "50.10"));

   public static void main(String[] args) {
       
       List<Vari> sortedList1 = users.stream()
               .sorted((o1, o2) -> {
                Double absVariance1=Double.parseDouble(o1.getAbsVariance()) ;
                Double absVariance2=Double.parseDouble(o2.getAbsVariance());
                   if(absVariance1 < absVariance2)
                       return 1;
                   else return -1;
               }).limit(5)
               .collect(Collectors.toList());
        
       sortedList1.forEach(System.out::println);

   }

   static class Vari {

       private String name;
       private String avar;

       public Vari(String name, String avar) {
           this.name = name;
           this.avar = avar;
       }

       public String getName() {
           return name;
       }

       public void setName(String name) {
           this.name = name;
       }

       public String getAbsVariance() {
           return avar;
       }

       public void setAbsVariance(String avar) {
           this.avar = avar;
       }

       @Override
       public String toString() {
           return "User{" +
                   "name='" + name + '\'' +
                   ", var=" + avar +
                   '}';
       }
   } }

1 Answers

First, remove the limit of 5. You will need the entire sorted list to do the summation of the remaining values.

To calculate the sums

  • take the fully sorted list and skip the first 5.
  • map the variance to a double value
  • then collect into a sum.
  • the finisher returns the Vari instance with the expected information.
Vari sums = sortedList1.stream().skip(5)
        .map(vari -> Double.valueOf(vari.getAbsVariance()))
                .collect(Collectors.collectingAndThen(
                        Collectors.summingDouble(sum -> sum),
                        sum->new Vari("Dummy",
                                       String.format("%.2f",sum))));

To print the first five, use a sublist of the list.

sortedList1.subList(0,5).forEach(System.out::println);
System.out.println(sums);

Prints

User{name='T', var=100.43}
User{name='E', var=50.10}
User{name='D', var=40.93}
User{name='C', var=30.99}
User{name='B', var=20.01}
User{name='Dummy', var=13.88}

And you can sort the list by using the Comparator functional interface.

List<Vari> sortedList1 = users.stream()
        .sorted(Comparator.comparingDouble((Vari vari) -> Double
                .parseDouble(vari.getAbsVariance()))
                .reversed())
        .collect(Collectors.toList());
Related