一、导读
本文着重讲解java8的Stream的一些基本操作
map,filter,sorted,collect
好文章 记得 收藏+点赞+关注 !!!
二、什么是stream
Stream(流)是一个来自数据源的元素队列并支持聚合操作
- 元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
- 数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
- 聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
和以前的Collection操作不同, Stream操作还有两个基础的特征:
- Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
- 内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。
三、stream的一些小练习
import com.gf.pojo.User;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
/**
* 练习使用串行流,并行流
*
* @author JiaMing
* @since 2021/12/7/0007 下午 14:14
**/
public class StreamTest {
public static void main(String[] args) {
//创建个定长的list
List<String> strings = Arrays.asList("jiaMing", "haha", "", "hello", "world");
//过滤掉空字符串
List<String> list = strings.stream().filter(s -> !s.isEmpty()).collect(Collectors.toList());
//for each遍历集合
list.forEach(System.out::println);
System.out.println("----------------------");
//for each遍历生成的10个随机数
Random random = new Random();
random.ints().limit(10).forEach(System.out::println);
System.out.println("----------------------");
//使用Filter计算空字符串个数
long count = list.stream().filter(String::isEmpty).count();
System.out.println(count + "个");
System.out.println("----------------------");
//limit 获取指定数量的流
list.stream().filter(s -> !s.isEmpty()).limit(2).forEach(System.out::println);
System.out.println("----------------------");
//sorted对流进行排序。对输出的 10 个随机数进行排序
random.ints().limit(10).sorted().forEach(System.out::println);
System.out.println("----------------------");
//map用于映射每个元素到对应的结果,使用 map 输出了元素对应的平方数
ArrayList<Integer> arrayList = new ArrayList<>();
arrayList.add(1);
arrayList.add(2);
arrayList.add(4);
arrayList.stream().map(integer -> integer * integer).distinct().forEach(System.out::println);
System.out.println("----------------------");
//使用stream提取List对象的某一列值,定义一个user类,创建几个user
List<User> users = new ArrayList<>();
users.add(new User(1, "佳明", "123456", "上海"));
users.add(new User(2, "张伟", "1234567", "帝都"));
users.add(new User(3, "叶若雪", "12342567", "花城"));
List<String> collect = users.stream().map(User::getUsername).distinct().collect(Collectors.toList());
collect.forEach(System.out::println);
}
}
注意:
使用Arrays.asList将数组转成集合时,当你向这个List添加或删除一个元素时(例如 list.add(“hello”);)程序就会抛出异常(java.lang.UnsupportedOperationException)
原因如下:
当你看到这段代码时可能觉得没有问题,不就是返回了一个ArrayList对象吗?问题就出在这里。
这个ArrayList不是java.util包下的,而是java.util.Arrays.ArrayList
它是Arrays类自己定义的一个静态内部类,这个内部类没有实现add()、remove()方法,而是直接使用它的父类AbstractList的相应方法。
而AbstractList中的add()和remove()是直接抛出java.lang.UnsupportedOperationException异常的!
如果你想创建可变长度的list可以这样:
List<String> list = new ArrayList<>();
list.addAll(Arrays.asList("haha","world"));