Java流 - 查找唯一元素

Gre*_*g_M 0 java java-8 java-stream

我有List<Person> persons = new ArrayList<>();,我想列出所有独特的名字.我的意思是如果有"John","Max","John","Greg"那么我只想列出"Max"和"Greg".有没有办法用Java流做到这一点?

alf*_*sin 8

我们可以使用流并Collectors.groupingBy计算每个名称的出现次数 - 然后筛选出现多次的任何名称:

    List<String> res = persons.stream()
            .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
            .entrySet()
            .stream()
            .filter(e -> e.getValue() == 1)
            .map(e -> e.getKey())
            .collect(Collectors.toList());

    System.out.println(res); // [Max, Greg]
Run Code Online (Sandbox Code Playgroud)


Min*_*nas 6

这是我的解决方案:

List<String> persons = new ArrayList<>();
persons.add("John");
persons.add("John");
persons.add("MAX");
persons.add("Greg");
persons.stream()
          .distinct()
          .sorted()
          .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)


Nik*_*pov 5

首先猜测解决方案。

persons.stream()
       .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()))
       .entrySet()
       .stream()
       .filter(entry -> entry.getValue() == 1)
       .map(Map.Entry::getKey)
       .collect(Collectors.toList())
Run Code Online (Sandbox Code Playgroud)


Raj*_*Mbm 5

List persons = new ArrayList();
    persons.add("Max");
    persons.add("John");
    persons.add("John");
    persons.add("Greg");

    persons.stream()
             .filter(person -> Collections.frequency(persons, person) == 1)
             .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)