Java__Stream流与数组集合的转换及一次性消费方法forEach

Stream流与数组集合的转换

java. util. stream. Stream是Java 8新加入的最常用的流接口。(这并不是一个函数式接口。)
获取一个流非常简单,有以下几种常用的方式:

所有的Collection集合都可以通过stream默认方法获取流;
    default Stream stream ()。

Stream接口的静态方法of可以获取数组对应的流;
    static Stream of (T… values)。

参数是一个可变参数,那么我们就可以传递一个数组。
以下则是集合与数组转变为流的方式:

public class StreamDemo {

	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		Stream<String> s1 = list.stream();

		Set<String> set = new HashSet<>();
		Stream<String> s2 = set.stream();

		Map<String,String> map = new HashMap<>();

		//获取键,存储到- -个Set集合中
		Set<String> keySet = map. keySet();
		Stream<String> s3 = keySet.stream();

		//获取值,存储到一-个Col lection集合中
		Collection<String> values = map. values();
		Stream s4 = values.stream();

		//获取键值对(键与值的映射关系entrySet)
		Set<Map. Entry<String,String>> entries = map.entrySet();
		Stream<Map. Entry<String, String>> s5
		= entries. stream();
		
		//把数组转换为Stream流
		Stream<Integer> s6 = Stream.of(1, 2, 3, 4, 5);
		//可变参数传递数组
		Integer[] arr = {1,2,3,4,5};
		Stream<Integer> s7 = Stream.of(arr);
		String[] arr2 = {"a","bb","CCC"};
		Stream<String> s8 = Stream.of(arr2);
	}
}

一次性消费方法forEach

Stream流中的常用方法_ forEach
    void forEach(Consumer<? super T> action);
        该方法接收- -个Consumer接口函数,会将每- -个流元素交给该函数进行处理。
    Consumer接口是一个消费型的函数式接口,可以传递L ambda表达式,消费数据
简单记:
    forEach方法,用来遍历流中的数据是一个终结方法,遍历之后就不能继续调用Stream流中的其他方法

Stream流中的常用方法filter:
    用于对Stream流中的数据进行过滤
Stream filter(Predicate<? super T> predicate);
    filter方法的参数Predicate是一个函数式接口, 所以可以传递L ambda表达式,对数据进行过滤
Predicate中的抽象方法:
    boolean test(T t);

    Stream流属于管道流,只能被消费(使用)一次第一个Stream流调用完毕方法,数据就会流转到下一个Stream上而这时第一个Stream流 已经使用完毕,就会关闭了所以第-个Stream流就不能再调用方法了

public class Practice {

	public static void main(String[] args) {
		String[] a = {"大佬","二老","三老","四老","五老"};
		Stream<String> s1 = Stream.of(a);
		//s1.forEach((String name)->{System.out.print(name);});
		s1.forEach((String name)->System.out.print(name+" "));	
	}
}

运行结果:

大佬 二老 三老 四老 五老 
若“//s1.forEach((String name)->{System.out.print(name);});”这行没有给注释掉,即有两个forEach方法;运行结果则会报错,如下
大佬二老三老四老五老Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
	at java.base/java.util.stream.AbstractPipeline.sourceStageSpliterator(AbstractPipeline.java:279)
	at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:658)
	at cn.yunhe.weekend.Practice.main(Practice.java:10)

故forEach为Stream流中的最终方法即一次性方法。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值