利用stream流统计出现一次的数字
时间: 2023-11-10 15:03:08 浏览: 63
假设要统计的数字列表为{1, 2, 3, 4, 4, 3, 2, 5, 6, 6, 7, 7, 8},可以使用Java 8中的stream流和collectors工具类来实现:
```
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class UniqueNumberCounter {
public static void main(String[] args) {
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 4, 3, 2, 5, 6, 6, 7, 7, 8);
Map<Integer, Long> counts = numbers.stream()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
System.out.println("Numbers that appear once:");
counts.entrySet().stream()
.filter(e -> e.getValue() == 1)
.map(Map.Entry::getKey)
.forEach(System.out::println);
}
}
```
运行结果为:
```
Numbers that appear once:
1
5
8
```
解释一下代码:
1. 首先将数字列表转换为一个流对象,使用groupingBy方法将相同数字分为一组,然后使用counting方法统计每组中数字出现的次数,最终得到一个Map<Integer, Long>类型的对象,其中key表示数字,value表示出现次数。
```
Map<Integer, Long> counts = numbers.stream()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
```
2. 使用entrySet方法将Map对象转换为一个Set集合,然后通过stream方法将其转换为一个流对象。使用filter方法过滤出现次数为1的数字,map方法将Map.Entry对象转换为数字,最后使用forEach方法遍历输出。
```
counts.entrySet().stream()
.filter(e -> e.getValue() == 1)
.map(Map.Entry::getKey)
.forEach(System.out::println);
```
阅读全文