Stream流式思想概述

Stream流式思想概述
主要用来对集合和数组进行转换,用Stream中的一些方法对其进行操作。这得益于Lambda表达式的出现。

一、使用传统的方式,遍历集合,对集合中的数据进行过滤

public class Demo01List {public static void main(String[] args) {//创建一个List集合,存储姓名List list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");//对list集合中的元素进行过滤,只要以张开头的元素,存储到一个新的集合中List listA = new ArrayList<>();for(String s : list){if(s.startsWith("张")){listA.add(s);}}//对listA集合进行过滤,只要姓名长度为3的人,存储到一个新集合中List listB = new ArrayList<>();for (String s : listA) {if(s.length()==3){listB.add(s);}}//遍历listB集合for (String s : listB) {System.out.println(s);}}
}


二、使用Stream流的方式遍历集合,对集合中的数据进行过滤
​ Stream流是JDK1.8之后出现的,关注的是做什么,而不是怎么做

public class Demo02Stream {public static void main(String[] args) {//创建一个List集合,存储姓名List list = new ArrayList<>();list.add("张无忌");list.add("周芷若");list.add("赵敏");list.add("张强");list.add("张三丰");//对list集合中的元素进行过滤,只要以张开头的元素,存储到一个新的集合中//对listA集合进行过滤,只要姓名长度为3的人,存储到一个新集合中//遍历listB集合list.stream().filter(name->name.startsWith("张")).filter(name->name.length()==3).forEach(name-> System.out.println(name));}
}


三、Stream的流式思想


当需要对多个元素进行操作的时候,考虑到性能及便利性,我们应该首先拼好一个模型不走方案,然后再按照方案去执行它。

Stream是一个来自数据源的元素队列。

元素是特定类型的对象,形成一个队列,java中的Stream并不会存储元素,而是按需计算。
数据源是流的来源,可以是集合,数组等。


四、流的获取


1.根据Collection获取流


首先,java.util.Collection接口中加入了default方法stream用来获取流 ,所以其所有实现类均可获取流。

public class Demo01GetStream {public static void main(String[] args) {//把集合转换为Stream流List list = new ArrayList<>();Stream stream1 = list.stream();Set set = new HashSet<>();Stream stream2 = set.stream();//把数组转换为Stream流Stream stream6 = Stream.of(1, 2, 3, 4, 5);//可变参数可以传递数组Integer[] arr = {1,2,3,4,5};Stream stream7 = Stream.of(arr);String[] arr2 = {"a","bb","ccc"};Stream stream8 = Stream.of(arr2);}
}



2.根据Map获取流


java.util.Map接口不是Collection的子接口,且其K-V数据结构不符合流元素的单一特征,所以获取对应的流需要分别获取Key,value或entry等情况。

 Map map = new HashMap<>();//获取键,存储到一个Set集合中Set keySet = map.keySet();Stream stream3 = keySet.stream();//获取值,存储到一个Collection集合中Collection values = map.values();Stream stream4 = values.stream();//获取键值对(键与值的映射关系 entrySet)Set> entries = map.entrySet();Stream> stream5 = entries.stream();



五、Stream流的常用方法


**终结方法:**返回值不是steam接口自身类型的方法,不再支持链式调用,终结方法包括count和foreach方法。

**延迟方法:**除终结方法之外,都是延迟方法

1.foreach方法


void forEach(Consumer action);​ 该方法接收一个Consumer接口函数,会将每一个流元素交给该函数进行处理。
​ Consumer接口是一个消费型的函数式接口,可以传递Lambda表达式,消费数据.

简单记:
​ forEach方法,用来遍历流中的数据
​ 是一个终结方法,遍历之后就不能继续调用Stream流中的其他方法

public class Demo02Stream_forEach {public static void main(String[] args) {//获取一个Stream流Stream stream = Stream.of("张三", "李四", "王五", "赵六", "田七");//使用Stream流中的方法forEach对Stream流中的数据进行遍历/*stream.forEach((String name)->{System.out.println(name);});*/stream.forEach(name->System.out.println(name));}
}


2.filter过滤


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

public class Demo03Stream_filter {public static void main(String[] args) {//创建一个Stream流Stream stream = Stream.of("张三丰", "张翠山", "赵敏", "周芷若", "张无忌");//对Stream流中的元素进行过滤,只要姓张的人Stream stream2 = stream.filter((String name)->{return name.startsWith("张");});//遍历stream2流stream2.forEach(name-> System.out.println(name));/*Stream流属于管道流,只能被消费(使用)一次第一个Stream流调用完毕方法,数据就会流转到下一个Stream上而这时第一个Stream流已经使用完毕,就会关闭了所以第一个Stream流就不能再调用方法了IllegalStateException: stream has already been operated upon or closed*///遍历stream流stream.forEach(name-> System.out.println(name));}
}


3.map映射


如果需要将流中的元素映射到另一个流中,可以使用map方法.
Stream map(Function mapper); 该接口需要一个Function函数式接口参数,可以将当前流中的T类型数据转换为另一种R类型的流。
​ Function中的抽象方法:R apply(T t);

public class Demo04Stream_map {public static void main(String[] args) {//获取一个String类型的Stream流Stream stream = Stream.of("1", "2", "3", "4");//使用map方法,把字符串类型的整数,转换(映射)为Integer类型的整数Stream stream2 = stream.map((String s)->{return Integer.parseInt(s);});//遍历Stream2流stream2.forEach(i-> System.out.println(i));}
}


4.count统计个数


Stream流中的常用方法_count:用于统计Stream流中元素的个数

long count(); count方法是一个终结方法,返回值是一个long类型的整数, 所以不能再继续调用Stream流中的其他方法了

public class Demo05Stream_count {public static void main(String[] args) {//获取一个Stream流ArrayList list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);Stream stream = list.stream();long count = stream.count();System.out.println(count);//7}
}



5.limit截取流中的元素

Stream流中的常用方法_limit:用于截取流中的元素
limit方法可以对流进行截取,只取用前n个。方法签名:
Stream limit(long maxSize); 参数是一个long型,如果集合当前长度大于参数则进行截取;否则不进行操作
​ limit方法是一个延迟方法,只是对流中的元素进行截取,返回的是一个新的流,所以可以继续调用Stream流中的其他方法

public class Demo06Stream_limit {public static void main(String[] args) {//获取一个Stream流String[] arr = {"美羊羊","喜洋洋","懒洋洋","灰太狼","红太狼"};Stream stream = Stream.of(arr);//使用limit对Stream流中的元素进行截取,只要前3个元素Stream stream2 = stream.limit(3);//遍历stream2流stream2.forEach(name-> System.out.println(name));}
}



6.skip跳过前 n 个元素Stream流中的常用方法_skip:用于跳过元素


如果希望跳过前几个元素,可以使用skip方法获取一个截取之后的新流:

Stream skip(long n); 如果流的当前长度大于n,则跳过前n个;否则将会得到一个长度为0的空流。public class Demo07Stream_skip {public static void main(String[] args) {//获取一个Stream流String[] arr = {"美羊羊","喜洋洋","懒洋洋","灰太狼","红太狼"};Stream stream = Stream.of(arr);//使用skip方法跳过前3个元素Stream stream2 = stream.skip(3);//遍历stream2流stream2.forEach(name-> System.out.println(name));}
}


7.concat两个流合并成一个流


Stream流中的常用方法_concat:用于把流组合到一起
如果有两个流,希望合并成为一个流,那么可以使用Stream接口的静态方法concat

static  Stream concat(Stream a, Stream b)public class Demo08Stream_concat {public static void main(String[] args) {//创建一个Stream流Stream stream1 = Stream.of("张三丰", "张翠山", "赵敏", "周芷若", "张无忌");//获取一个Stream流String[] arr = {"美羊羊","喜洋洋","懒洋洋","灰太狼","红太狼"};Stream stream2 = Stream.of(arr);//把以上两个流组合为一个流Stream concat = Stream.concat(stream1, stream2);//遍历concat流concat.forEach(name-> System.out.println(name));}
}



练习


现在有两个ArrayList集合存储队伍当中的多个成员姓名,要求使用传统的for循环(或增强for循环)依次进行以下若干操作步骤:
1. 第一个队伍只要名字为3个字的成员姓名;存储到一个新集合中。
2. 第一个队伍筛选之后只要前3个人;存储到一个新集合中。
3. 第二个队伍只要姓张的成员姓名;存储到一个新集合中。
4. 第二个队伍筛选之后不要前2个人;存储到一个新集合中。
5. 将两个队伍合并为一个队伍;存储到一个新集合中。
6. 根据姓名创建Person对象;存储到一个新集合中。
7. 打印整个队伍的Person对象信息。

public class Practice02 {public static void main(String[] args) {ArrayList one = new ArrayList<>();one.add("迪丽热巴");one.add("宋远桥");one.add("苏星河");one.add("石破天");one.add("石中玉");one.add("老子");one.add("庄子");one.add("洪七公");Stream oneStream = one.stream().filter(name ->name.length() == 3).limit(3);//第二支队伍ArrayList two = new ArrayList<>();two.add("古力娜扎");two.add("张无忌");two.add("赵丽颖");two.add("张三丰");two.add("尼古拉斯赵四");two.add("张天爱");two.add("张二狗");Stream twostream = two.stream().filter(name -> name.startsWith("张")).skip(2);Stream.concat(oneStream,twostream).map(name-> new Person(name)).forEach(p-> System.out.println(p));}
}

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部