一、stream流的常见生成方式
1、Collection体系集合
使用默认方法stream()生成流, default Stream
- //Collection体系的集合可以使用默认方法stream()生成流
- List
list = new ArrayList(); - Stream
listStream = list.stream(); -
- Set
set = new HashSet(); - Stream
setStream = set.stream();
2、Map体系集合
把Map转成Set集合,间接的生成流
- //Map体系的集合间接的生成流
- Map
map = new HashMap(); - Stream
keyStream = map.keySet().stream(); - Stream
valueStream = map.values().stream(); - Stream
> entryStream = map.entrySet().stream();
3、数组
通过Arrays中的静态方法stream生成流
- //数组可以通过Arrays中的静态方法stream生成流
- String[] strArray = {"hello","world","java"};
- Stream
strArrayStream = Arrays.stream(strArray);
4、同种数据类型的多个数据
通过Stream接口的静态方法of(T... values)生成流
- //同种数据类型的多个数据可以通过Stream接口的静态方法of(T... values)生成流
- Stream
strArrayStream2 = Stream.of("hello", "world", "java"); - Stream
intStream = Stream.of(10, 20, 30);
二、Stream流中间操作方法
中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作
常见方法
Stream
- //创建一个集合,存储多个字符串元素
- ArrayList
list = new ArrayList(); -
- list.add("林青霞");
- list.add("张曼玉");
- list.add("王祖贤");
- list.add("柳岩");
- list.add("张敏");
- list.add("张无忌");
-
- //需求1:把list集合中以张开头的元素在控制台输出
- list.stream().filter(s -> s.startsWith("张")).forEach(System.out::println);
- System.out.println("--------");
-
- //需求2:把list集合中长度为3的元素在控制台输出
- list.stream().filter(s -> s.length() == 3).forEach(System.out::println);
- System.out.println("--------");
-
- //需求3:把list集合中以张开头的,长度为3的元素在控制台输出
- list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(System.out::println);
Stream
Stream
- //创建一个集合,存储多个字符串元素
- ArrayList
list = new ArrayList(); -
- list.add("林青霞");
- list.add("王祖贤");
- list.add("柳岩");
- list.add("张敏");
- list.add("张无忌");
-
- //需求1:取前3个数据在控制台输出
- list.stream().limit(3).forEach(System.out::println);
- System.out.println("--------");
-
- //需求2:跳过3个元素,把剩下的元素在控制台输出
- list.stream().skip(3).forEach(System.out::println);
- System.out.println("--------");
-
- //需求3:跳过2个元素,把剩下的元素中前2个在控制台输出
- list.stream().skip(2).limit(2).forEach(System.out::println);
static
Stream
- //创建一个集合,存储多个字符串元素
- ArrayList
list = new ArrayList(); -
- list.add("林青霞");
- list.add("张曼玉");
- list.add("王祖贤");
- list.add("柳岩");
- list.add("张敏");
- list.add("张无忌");
-
- //需求1:取前4个数据组成一个流
- Stream
s1 = list.stream().limit(4); -
- //需求2:跳过2个数据组成一个流
- Stream
s2 = list.stream().skip(2); -
- //需求3:合并需求1和需求2得到的流,并把结果在控制台输出
- Stream.concat(s1,s2).forEach(System.out::println);
-
- //需求4:合并需求1和需求2得到的流,并把结果在控制台输出,要求字符串元素不能重复
- Stream.concat(s1,s2).distinct().forEach(System.out::println);
Stream流终结操作方法
终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作
void forEach(Consumer action) 对此流的每个元素执行操作
long count() 返回此流中的元素数
- //创建一个集合,存储多个字符串元素
- ArrayList
list = new ArrayList(); -
- list.add("林青霞");
- list.add("张曼玉");
- list.add("王祖贤");
- list.add("柳岩");
- list.add("张敏");
- list.add("张无忌");
-
- //需求1:把集合中的元素在控制台输出
- list.stream().forEach(System.out::println);
-
- //需求2:统计集合中有几个以张开头的元素,并把统计结果在控制台输出
- long count = list.stream().filter(s -> s.startsWith("张")).count();
- System.out.println(count);
Stream流的收集操作
对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中
R collect(Collector collector) 把结果收集到集合中
工具类Collectors提供了具体的收集方式
public static
public static
public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中
- //创建List集合对象
- List
list = new ArrayList(); - list.add("林青霞");
- list.add("张曼玉");
- list.add("王祖贤");
- list.add("柳岩");
-
-
- //需求1:得到名字为3个字的流
- Stream
listStream = list.stream().filter(s -> s.length() == 3); -
- //需求2:把使用Stream流操作完毕的数据收集到List集合中并遍历
- List
names = listStream.collect(Collectors.toList()); - for(String name : names) {
- System.out.println(name);
- }
-
-
- //创建Set集合对象
- Set
set = new HashSet(); - set.add(10);
- set.add(20);
- set.add(30);
- set.add(33);
- set.add(35);
-
-
- //需求3:得到年龄大于25的流
- Stream
setStream = set.stream().filter(age -> age > 25); -
- //需求4:把使用Stream流操作完毕的数据收集到Set集合中并遍历
- Set
ages = setStream.collect(Collectors.toSet()); - for(Integer age : ages) {
- System.out.println(age);
- }
-
- //定义一个字符串数组,每一个字符串数据由姓名数据和年龄数据组合而成
- String[] strArray = {"林青霞,30", "张曼玉,35", "王祖贤,33", "柳岩,25"};
-
- //需求5:得到字符串中年龄数据大于28的流
- Stream
arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 28); -
- //需求6:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
- Map
map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1]))); -
- Set
keySet = map.keySet(); - for (String key : keySet) {
- Integer value = map.get(key);
- System.out.println(key + "," + value);
- }