stream是数据渠道,用于操作数据源(集合、数组)所生产的元素序列。这一类操作称作局和操作,它的基本流程是:
1、将原始数据或数组对象转换为stream流。
2、对stream流中的元素进行一系列的过滤、查找等中间操作(Intermediate Operations),然后 仍返回一个Stream流对象
3、对stream流进行统计、遍历、收集等终结操作(Terminal Operation)获取想要的结果。
Stream流有以下的特点:
- stream是不能存储数据,只能对数据进行一些列流式的操作。
- stream是惰性加载(延迟执行),一系列流式的操作会在要结果的时候一起执行。
- 不会修改源数据。
- 每次操作得到一个新的流,不能对同一个stream执行多次操作 ,因为源流操作过以后就被破坏了。
1、所有的Collection集合都可以使用接口中的默认方法stream()获取Stream流对象。该方法来自StreamSupport类的静态方法。
2、Stream接口的of()静态方法可以获取基本类型和包装类数组、引用类型数组和单个元素的stream对象。of(T… values)方法为可变参数或of(T t)
3、Arrays数组工具类的stream()静态方法可以获取数组元素的stream流对象。
创建Card类,私有属性为字符串类的name、int类型的攻击力、int类型的血量。创建一个容器保存一些数据,对这些数据转换的stream流进行filter筛选。
public class Demo02 {
static List<Card> list = Arrays.asList(
//名称、攻击、血量
new Card("了不起的杰弗里斯",3,2),
new Card("红龙女王阿莱克斯塔萨",8,8),
new Card("死亡之翼",12,12),
new Card("小精灵",1,1),
new Card("转校生",2,2),
new Card("巫妖王",8,8),
new Card("魔古山守望者",1,7));
public static void main(String[] args) {
//filter接收Lambda,排除流中攻击力小于8的卡牌
Stream<Card> stream = list.stream().filter((e)->{
return e.getAttack()>=8;
});
//对流进行终结操作
stream.forEach(System.out::println);
}
}
//运行结果:
Card [name=红龙女王阿莱克斯塔萨, attack=8, blood=8]
Card [name=死亡之翼, attack=12, blood=12]
Card [name=巫妖王, attack=8, blood=8]
public class Demo03 {
static List<Card> list = Arrays.asList(
new Card("了不起的杰弗里斯",3,2),
new Card("红龙女王阿莱克斯塔萨",8,8),
new Card("死亡之翼",12,12),
new Card("小精灵",1,1),
new Card("转校生",2,2),
new Card("巫妖王",8,8),
new Card("魔古山守望者",1,7));
public static void main(String[] args) {
//limit-截断流,使其元素不超过给定数量
//排除流中攻击力小于3的卡牌,限制为3个
list.stream().filter((e)->{
return e.getAttack()>=3;
}).limit(3).forEach(System.out::println);
}
}
//运行结果:
Card [name=红龙女王阿莱克斯塔萨, attack=8, blood=8]
Card [name=死亡之翼, attack=12, blood=12]
Card [name