Java——Stream流

Java——Stream流

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流对象。


Stream的中间操作

1. 筛选和切片

1.1 filter

创建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]

1.2 limit

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

你可能感兴趣的:(java,stream)