Java基础(下)之Stream
Stream流
Stream流的作用是结合Lambda表达式,简化集合、数组的操作,其使用步骤可总结为:
- 先得到一条Stream流(流水线),并把数据放上去;

- 使用中间方法对流水线上数据进行操作;

- 使用终结方法对流水线上数据进行操作;

获取Stream流
package com.example.helloworld;
import java.io.*;
import java.util.*;
import java.util.stream.Stream;
class Main{
public static void main(String[] args) throws Exception{
//单列集合
ArrayList<String> list1 = new ArrayList<>();
Collections.addAll(list1,"张三","张三丰","李四","王二");
list1.stream().forEach(name -> System.out.println(name));
//双列集合
HashMap<String,Integer>mp = new HashMap<>();
mp.put("aaa",111);
mp.put("bbb",222);
mp.put("ccc",333);
mp.put("ddd",444);
mp.keySet().stream().forEach(e -> System.out.println(e));
mp.entrySet().stream().forEach(pair -> System.out.println(pair));
//数组
int[] arr1 = {11,22,3,44,555};
String[] arr2 = {"123","456","999"};
Arrays.stream(arr1).forEach(num -> System.out.println(num));
Arrays.stream(arr2).forEach(str -> System.out.println(str));
//一堆零散数据
//方法的形参是一个可变参数,可以传递一堆零散的数据,也可以传递数组
//但是数组必须是引用数据类型的,若传递基本数据类型,则会把整个数组当作一个元素,放到Stream中。
Stream.of(1,2,3,4,5).forEach(num-> System.out.println(num));
Stream.of("a","b","c","d","e").forEach(num-> System.out.println(num));
Stream.of(arr1).forEach(num-> System.out.println(num));
}
}
中间方法
package com.example.helloworld;
import java.util.*;
import java.util.stream.Stream;
class Main{
public static void main(String[] args) throws Exception{
//单列集合
ArrayList<String> list1 = new ArrayList<>();
Collections.addAll(list1,"张三","张三丰","张益达","李四","王二","张三丰","张益达");
ArrayList<String> list2 = new ArrayList<>();
Collections.addAll(list2,"赵四","李龙");
ArrayList<String> list3 = new ArrayList<>();
Collections.addAll(list3,"张三-10","张三丰-13","张益达-14");
//过滤出张开头且长度为3的名字
list1.stream()
.filter(name -> name.startsWith("张"))
.filter(name->name.length() == 3)
.forEach(name -> System.out.printf("%s ",name));
System.out.println();
//只取前几个元素
list1.stream()
.limit(3)
.forEach(name -> System.out.printf("%s ",name));
System.out.println();
//跳过前几个元素
list1.stream()
.skip(2)
.forEach(name -> System.out.printf("%s ",name));
System.out.println();
//去重
list1.stream()
.distinct()
.forEach(name-> System.out.printf("%s ",name));
System.out.println();
//合并两个流为一个流
Stream.concat(list1.stream(),list2.stream())
.forEach(name-> System.out.printf("%s ",name));
System.out.println();
//转换流中数据类型
list3.stream().map(name -> Integer.parseInt(name.split("-")[1]))
.forEach(age -> System.out.printf("%d ",age));
System.out.println();
}
}
注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
ArrayList<String> list1 = new ArrayList<>();
Collections.addAll(list1,"张三","张三丰","张益达","李四","王二");
Stream<String> stream1 = list1.stream().filter(name -> name.startsWith("张") && name.length() == 3);
stream1.forEach(name-> System.out.println(name));
//Stream已经执行了终结方法后关闭了,无法再次执行中间方法
stream1.filter(name->name.length()==3);
注意2:修改Stream流中的数据,不会影响原来集合或者数组中的数据
终结方法
注意1:执行终结方法后,无法再接着使用该Stream;
package com.example.helloworld;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class Main{
public static void main(String[] args) throws Exception{
//单列集合
ArrayList<String> list1 = new ArrayList<>();
Collections.addAll(list1,"张三","张三丰","张益达","李四","王二","张三丰","张益达");
//遍历流中的每个元素
list1.stream().forEach(name-> System.out.printf("%s ",name));
System.out.println();
//统计流中元素的个数,返回值为long
long count = list1.stream().count();
System.out.println(count);
//将流中的元素放入数组并返回,size为集合中的元素个数
String[] arr1 = list1.stream().toArray(size->new String[size]);
System.out.println(Arrays.toString(arr1));
return ans.toArray(new int[ans.size()][]);//注意二维ArrayList转二维数组的写法
//收集流中的数据,放到集合中(List、Set、Map)
ArrayList<String> list2 = new ArrayList<>();
Collections.addAll(list2,"张三丰-男-15","李四-女-16","王二-男-22","张伦-男-20","张伦达-男-20");
//收集到List集合中
List<String> newlist = list2.stream()
.filter(person -> "男".equals(person.split("-")[1])) //男在前防止null导致的异常
.collect(Collectors.toList());//创建一个List,把流中元素放入其中并返回
System.out.println(newlist);
//收集到Set集合中,与List的区别在于:是否可重复、是否有序、是否可随机访问
Set<String> newset = list2.stream()
.filter(person -> "男".equals(person.split("-")[1])) //男在前防止null导致的异常
.collect(Collectors.toSet());//创建一个Set,把流中元素放入其中并返回
System.out.println(newset);
//收集到Map集合中,其中姓名作为Key,年龄作为Value
Map<String, Integer> newmap = list2.stream()
.filter(person -> "男".equals(person.split("-")[1])) //男在前防止null导致的异常
.collect(Collectors.toMap(person -> person.split("-")[0], person -> Integer.parseInt(person.split("-")[2])));
System.out.println(newmap);
}
总结


浙公网安备 33010602011771号