Stream流你一定要看看

本文通过实例展示了如何使用Java Stream流进行集合和数组的操作,包括过滤、计数、跳过、限制等,以及如何转换为List、Set和数组。讲解了map方法进行元素加工,concat方法合并流,并探讨了Stream流的收集转换。
摘要由CSDN通过智能技术生成

Stream流可以用来简化集合和数组中的一些操作方法

来个案列热热身

找出集合中姓张的三位数名字的人

import java.util.ArrayList;
import java.util.List;
public class Test_01 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("张无忌");
		list.add("周强强");
		list.add("张三");
		list.add("花无缺");
		list.add("张三丰");
		//思路:遍历集合如果符合要求的就将它加入新的集合中
		List<String> list2 = new ArrayList<>();
		for(String a: list) {
			if(a.length() == 3 && a.startsWith("张")) {
				list2.add(a);
			}
		}
		for(String ss : list2) {
			System.out.println(ss);
		}
	}
}

接下来看一下Stream流怎么完成

import java.util.ArrayList;
import java.util.List;
public class Test_01 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("张无忌");
		list.add("周强强");
		list.add("张三");
		list.add("花无缺");
		list.add("张三丰");
		//一行代码找出
		list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length()==3).forEach(System.out::println);
		}
}

一行代码就可以解决

画图助理解

在这里插入图片描述
它类似一条传送带在传输的过程中进行筛选和其他工作想象一下工厂的传送带

怎么获取Stream流呢?

        //获取Collection集合的流
		Collection<String> list = new ArrayList<>();
		Stream<String> s = list.stream();
		
		//map集合获取流
		Map<String,Integer> map  = new HashMap<String,Integer>();
		//获取键的流
		Stream<String> s1 =map.keySet().stream();
		//获取值的流
		Stream<Integer> s2 = map.values().stream();
		//获取键值对的流
		Stream<Map.Entry<String, Integer>> s3 = map.entrySet().stream();
		
		//获取数组的流
		String[] arr = new String[] {"张三","李四","王五","马六"};
		Stream<String> s4 = Arrays.stream(arr);
		Stream<String> s5 = Stream.of(arr);

常用api

//有这么一个集合
List<String> li = new ArrayList<String>();
		li.add("张三");
		li.add("天山童姥");
		li.add("张无忌");
		li.add("张三丰");
		li.add("花无缺");
		//找出姓张的人,并打印
		li.stream().filter(sa -> sa.startsWith("张")).forEach(System.out::println);
		//count():计数。找出姓张的有多少人
		long i = li.stream().filter(sa -> sa.startsWith("张")).count();
		System.out.println("姓张的一共有"+i+"人");
		//skip(int i)跳过符合条件的前i个找出姓张的且跳过前两个人
		li.stream().filter(sa -> sa.startsWith("张")).skip(2).forEach(System.out::println);
		//limit(int i) 得到符合结果的前i个
		li.stream().filter(sa -> sa.startsWith("张")).limit(2).forEach(System.out::println);
//打印结果:
张三
张无忌
张三丰

姓张的一共有3人

张三丰

张三
张无忌

map()方法,将传递进来的元素进行加工
//将所有的元素加上一个你好
li.stream().map(ss -> "你好:"+ss).forEach(System.out::println);
//输出结果
你好:张三
你好:天山童姥
你好:张无忌
你好:张三丰
你好:花无缺

concat()合并流
//将o1和o2流合并成o3
Stream<String> o1 = list1.stream();
Stream<String> o2 = list2.stream();
Stream<String> o3 = Stream.concat(o1,o2);


问题来了,我们通过Stream可以做什么呢?就是普通进行遍历吗?
其实不然Stream流主要是我们可以将它作为一种处理集合中元素的一种方法,主要在经过Stream的处理后我们往往是需要将它转换为原本的集合的,那么又是怎样将它转换为集合的。

它来了

收集流:

直接看一下代码就ok,不需要我们知道底层的原理,只要会用就行了

//先来一个集合
List<String> list = new ArrayList<String>();
list.add("张三");
list.add("李四");
list.add("霍元甲");
list.add("孙悟空");
list.add("王五");
list.add("王五");
/*需求:
找出名字为两个字的人,将他们写入一个新的集合
此时用Stream流来进行处理
*/     //Stream转换为List集合
	  Stream<String> ss = 	list.stream().filter(s -> s.length() == 2);
	  //将Stream流转换为List集合
	  List<String> list2 = ss.collect(Collectors.toList());
	  System.out.println(list2);
	  //!注意,这个流在使用过后就不可以使用了,因为他已经流完了
	  //打印结果为[张三,李四,王五,王五]
	  
	  //使用流来进行筛选出名字个数为2的人,并且放进set集合
	  //Stream转换为Set集合
	  Stream<String> ss1 = 	list.stream().filter(s -> s.length() == 2);
	  Set<String> set2 = ss1.collect(Collectors.toSet());
	  System.out.println(set2);
	  //打印结果:[张三,李四,王五]
    //将Stream流转换为数组
      Integer[] arr = {1,2,3,4,5,6,7,8}; //有一个数组,通过流来取到偶数
	  Stream<Integer> file = Arrays.stream(arr).filter(i -> i%2 == 0);
	  //将Stream流转换为数组
	  Object[] arr2 = file.toArray();
	  for(Object s: arr2) {
		  System.out.println(s);
	  }

实际开发中我们使用基本都是集合,一般是不适用Stream来进行数据的交互的,因此我们都是要将Stream流集合成集合或者数组的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值