Stream流是用于对数组和集合进行便捷操作的。
Stream流
学习Stream流的步骤:获取Stream流,Stream流常见的中间方法,Stream流常见的终结方法。
Stream流的创建
- 获取数组的Stream流:Arrays.stream(arr)
- 获取List集合的Stream流:list.stream( )
- 获取Set集合的Stream流:hashSet.stream( )
- 获取Map集合的Stream流:
Set<Map.Entry<Integer, String>> entries = hashMap.entrySet(); Stream<Map.Entry<Integer, String>> stream2 = entries.stream();
Stream流中间方法
中间方法指的是调用完流之后其结果是一个新的流,还可以继续调用方法,这样一来就可以支持链式编程。
调用中间方法时,一定要连续调用,否则会抛出IllegalStateException异常
常用的中间方法
peek方法不改变流的元素,只是对流中的元素进行操作,然后将流传递给下一个动作。
peek是惰性的,只有在最终操作(forEach,collect,count等)被调用时才会执行。
Stream终结方法
终结方法不能连续调用,因为此时流已经关闭。
Collectors.toList( ):将Stream流中的元素累计到一个List集合中然后返回
Collectors.toSet( ):将Stream流中的元素累计到一个Set集合中然后返回
流的应用案例
案例需求:有一个List集合,元素有 " 张三丰 "," 张无忌 "," 周芷若 "," 赵敏 "," 张强 " ,找出姓张,且是3个字的名 字,存入到一个新集合中去。
public static void main(String[] args) {List<String> names = new ArrayList<>();Collections.addAll(names,"张无忌","张三丰","周芷若","张强","赵敏");System.out.println(names);//找到所有姓张的,且只有三个字List<String> threeName = new ArrayList<>();names.forEach(s -> {if(s.startsWith("张") && s.length() == 3){threeName.add(s);}});System.out.println(threeName);HashSet<String> hashSet = new HashSet<>();//List集合的stream流Stream<String> stream = names.stream();//Sset集合的stream流Stream<String> stream1 = hashSet.stream();HashMap<Integer,String> hashMap = new HashMap<>();//Map集合的stream流,需要用存放键值对的entrySetSet<Map.Entry<Integer, String>> entries = hashMap.entrySet();Stream<Map.Entry<Integer, String>> stream2 = entries.stream();String[] strings = {"1","2","3","4"};//数组获取流的方法Stream<String> stream3 = Arrays.stream(strings);stream3.filter(new Predicate<String>() {@Overridepublic boolean test(String s) {//s是stream流里面的元素System.out.println(s);return s.startsWith("张") && s.length() == 3;}});//stream是获取的流对象,filter中间添加了过滤条件,collect终结方法,流式编程(链式编程)Set<String> set = stream.filter(s -> s.startsWith("张") && s.length() == 3).collect(Collectors.toSet());System.out.println(set);}