Java 8 Streams : get non repeated counts

  • A+
Category:Languages

Here is the SQL version for the input and output :

     with tab1 as (          select 1 as id from dual union all         select 1 as id from dual union all         select 2 as id from dual union all         select 2 as id from dual union all         select 5 as id from dual          )      select id from tab1 group by id having count(id)=1;  Output is Id=5 and count is 1 

As 5 is non repeated.How do i implement it using JAVA 8 streams?

I tried below but obviously it is giving wrong result

List<Integer> myList = new ArrayList<Integer>();                 myList.add(1);                 myList.add(1);                 myList.add(2);                 myList.add(2);                 myList.add(5);                  Long f =  myList.stream()                           .distinct().count();                  System.out.println(f); 

 


long result = myList.stream()          .collect(Collectors.groupingBy(                    Function.identity(),                   Collectors.counting()))          .entrySet()          .stream()          .filter(entry -> entry.getValue() == 1)          .map(Entry::getKey)          .count(); 

Well you collect all the elements to a Map<Integer, Long>, where the key is the value itself, and value is how many times it is repeated. Later we stream the entry set from that resulting map and filter only those entries that that have a count of 1 (meaning they are not repeated), later we map to Entry::getKey - to get that value from the List and count.

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: