stream是什么?
stream可以简化对集合的操作,具体操作由流内部实现,而无需用户自行实现过程
stream优点
对于以下ArrayList
List<String> words = new ArrayList<>();
words.add("tom");
words.add("john");
如果我们要统计其长度大于4的字符串,需要循环进行遍历
int count = 0;
for (String s : words) {
if (s.length() >= 4) {
count++;
}
}
而使用stream,无需遍历和计数,只需要指定做什么,而无需关注怎么做
long count = words.stream().filter(s -> s.length() >=4).count();
stream和集合的区别
- stream不存储元素
- stream的操作不会修改源数据,而是生成一个新的流,下一个操作是在上一个操作所生成的流中进行
- stream的操作是Lazy的,只有在真正需要时才会调用,如上filter在匹配到第4个单词时就停止过滤
stream的创建
对于任何实现类Collection的子类,都可通过stream()方法获取流
List<String> list= new ArrayList<>();
Stream<String> stream = list.stream();
对于个别元素,可用Stream.of()构建
Stream<String> stream = Stream.of("tom", "john");
对于数组,可用Arrays.stream()构建
String[] strings=new String[]{"tom","john"};
Stream<String> stream = Arrays.stream(strings);
构建空的stream,可通过泛型指定其元素类型
Stream<Object> stream = Stream.empty();
使用generage生成无限stream,如生成随机数流
Stream<Double> stream = Stream.generate(Math::random);
steam的操作
filter()可指定流的过滤条件,如将长度大于3的元素筛选出来
List<String> list = new ArrayList<>();
Stream<String> stringStream = list.stream().filter(s -> s.length() > 3);
map()可指定流的转换条件,如将单词转为小写
Stream<String> stringStream = list.stream().map(s -> s.toLowerCase());
limit()可截取流,如生成10个随机数流
Stream<Double> stream = Stream.generate(Math::random).limit(10);
distinct()可去除流中的重复元素
Stream<String> stream = list.stream().distinct();
sort()可对流进行排序,可调用默认比较器或自行定义比较器
Stream<String> sort1 = list.stream().sorted();
Stream<String> sort2 = list.stream().sorted(Comparator.comparing(String::length).reversed());
从steam中取值
以下从数组的stream中取出最大值,
OptionalInt max = Arrays.stream(new int[]{1, 2, 3}).max();
int i = max.orElse(0);