Java Stream流指南:优雅处理集合数据
文章目录
- 一、为什么要使用stream流呢?
- 二、如何获取Stream流?
- 三、Stream流的中间方法
- 四、Stream流的终结方法
- 总结
一、为什么要使用stream流呢?
想必我们在日常编程中,会经常进行数据的处理,我们先来看看没有stram流时,我们的操作方式,我们想要收集姓赵的学生姓名。
(图片来源网络,侵删)public class StreamDemo { public static void main(String[] args) { ArrayList list = new ArrayList(); Collections.addAll(list,"赵子龙","猪大肠","赵坤","张良","赵雯"); ArrayList list1 = new ArrayList(); list.forEach(s -> { if(s.startsWith("赵")) { list1.add(s); } }); list1.forEach(s -> System.out.println(s)); } }
这是我们在没有接触到Stream流时的操作方法,虽然使用lambda简化写法了,但还是不够优雅。
下面我使用Stream流的方式来操作一下:
public class StreamDemo { public static void main(String[] args) { ArrayList list = new ArrayList(); Collections.addAll(list,"赵子龙","猪大肠","赵坤","张良","赵雯"); list.stream().filter(s -> s.startsWith("赵")).forEach(s -> System.out.println(s)); } }
使用Stream流后的操作是不是比刚开始的操作要优雅许多,大家先不用管这块代码怎么写的,我会在下面一一讲解到。
二、如何获取Stream流?
我们可以简单理解Stream流就是一条流水线。
Stream流的作用: 结合Lambda表达式,简化集合、数组的操作
Stream流的使用步骤:
- 先得到一条Stream流(流水线),并把数据放上去
- 利用Stream流中的API进行各种操作(过滤、转换、统计、打印等)
获取方式 方法名 说明 单列集合 default Stream stream() Collection中的默认方法 双列集合 无 无法直接使用stream流,需要先转为单列集合 数组 publis static Stream stream(T[] array) Arrays工具类中的静态方法 零散数据 public static Stream of(T… values) Stream接口中的静态方法 单列集合:
我们可以发现单列集合可以直接调用stream方法获取Stream流。
我们使用下stream流的forEach方法,顾名思义就是打印方法。
我们可以看到forEach方法的参数是一个函数式接口,所以我们可以使用lambda表达式简化,我们先写一下匿名内部类的写法:
public static void main(String[] args) { ArrayList list = new ArrayList(); Collections.addAll(list,"赵子龙","猪大肠","赵坤","张良","赵雯"); Stream stream = list.stream(); stream.forEach(new Consumer() { @Override public void accept(String s) { System.out.println(s); } }); }
然后我们在使用lambda表达式对匿名内部类进行简化:
public static void main(String[] args) { ArrayList list = new ArrayList(); Collections.addAll(list,"赵子龙","猪大肠","赵坤","张良","赵雯"); Stream stream = list.stream(); stream.forEach(s -> System.out.println(s)); }
双列集合:
双列集合是无法直接获取stream流的,所以我们需要先将双列集合转换为单列集合,再去进行流式操作。
第一种方式,先将map转为Keyset:
public static void main(String[] args) { Map map = new HashMap(); map.put("四级",425); map.put("六级",425); map.put("考研",436); // 1.第一种获取stream流方式 map.keySet().stream().forEach(s -> { System.out.println(s + ": " + map.get(s)); }); }
第二种方式,转为EntrySet:
// 2.第二种获取stream方式 map.entrySet().stream().forEach(s -> System.out.println(s));
数组:
public static void main(String[] args) { int[] arr = {2,9,3,74,2,1}; // 使用Arrays中的stream方法获取stream流 Arrays.stream(arr).forEach(s -> System.out.println(s)); }
零散数据:
零散数据使用Stream.of()方法获取stream流:
public static void main(String[] args) { Stream.of(1,2,4,3,2,5).forEach(s -> System.out.println(s)); }
需要注意的坑:
我们来看Stream.of()方法的参数是泛型可变参数,那证明可以接受数组数据,我们一起来试一下
当我们传入的数据是引用数据类型的时候是可以正常操作的,我们再来试试基本数据类型的数组
当我们传入基本数据类型时,发现打印的是地址,当我们使用Stream.of()方法传入基本数据类型的数组获取stream流时,是将整个数据当作一个元素的
三、Stream流的中间方法
方法 作用 Stream filter(Predicate 文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。
还没有评论,来说两句吧...