赞
踩
目录
需求:按照下面的要求完成集合的创建和遍历
使用Stream流的方式完成过滤操作
实例:
- public class StreamTest {
- public static void main(String[] args) {
- ArrayList<String> list = new ArrayList<String>();
-
- list.add("张曼玉");
- list.add("周星驰");
- list.add("刘德华");
- list.add("张敏");
- list.add("张无忌");
-
- ArrayList<String> zhanglist = new ArrayList<>();
-
- for (String s :
- list) {
- if (s.startsWith("张")) {
- zhanglist.add(s);
- }
- }
-
- ArrayList<String> threelist = new ArrayList<>();
-
- for (String s :
- zhanglist) {
- if(s.length() == 3) {
- threelist.add(s);
- }
- }
-
- for (String s :
- threelist) {
- System.out.println(s);
- }
- System.out.println("------");
-
- //Stream流改进
- list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(System.out::println);
- }
- }

控制台输出:
stream流的使用
通过数据源(集合,数组等)生成流
list.stream()
一个流后面可以跟随零个或多个中间操作,其目的主要是打开流,做出某种程度的数据过滤/映射,然后返回一个新的流,交给下一个操作
filter()
一个流只能有一个终结操作,当这个操作执行后,流就被使用完毕了,无法再被操作。所以这必定是流的最后一个操作forEach()
Stream流的常见生成方式
实例:
- public class StreamTest {
- public static void main(String[] args) {
- //Collection体系的集合可以使用默认方式stream()生成流
- List<String> list = new ArrayList<String>();
- Stream<String> listStream = list.stream();
-
- Set<String> set = new HashSet<String>();
- Stream<String> setStream = set.stream();
-
- //Map体系的集合间接的生成流
- Map<String, Integer> map = new HashMap<>();
- Stream<String> keyStream = map.keySet().stream();
- Stream<Integer> valueStream = map.values().stream();
- Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();
-
- //数组可以通过Stream接口的静态方法of(T...values)生成流
- String[] strArray = {"java", "python", "html"};
- Stream<String> strArrayStream = Stream.of(strArray);
- Stream<String> strArrayStream2 = Stream.of("hello", "world", "!");
- Stream<Integer> intStream = Stream.of(10, 29, 39);
- }
- }

Predicate接口中的方法 boolean test(T t):对给定的参数进行判断,返回一个布尔值
Function接口中的方法 R apply(T t)
IntStream:表示原始int流
ToIntFunction接口中的方法 int applyAsInt(T value)
实例:
- package com.lu.bean.test3;
-
- import java.util.ArrayList;
- import java.util.stream.Stream;
-
- public class StreamTest {
- public static void main(String[] args) {
- ArrayList<String> list = new ArrayList<String>();
-
- list.add("张曼玉");
- 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);
- System.out.println("--------");
-
- //需求4:取前3个数据在控制台输出
- list.stream().limit(3).forEach(System.out::println);
- System.out.println("--------");
-
- //需求5:跳过3个元素,把剩下的元素在控制台输出
- list.stream().skip(3).forEach(System.out::println);
- System.out.println("--------");
-
- //需求6:跳过2个元素,把剩下的元素中前2个在控制台输出
- list.stream().skip(2).limit(2).forEach(System.out::println);
- System.out.println("--------");
-
- //需求7:取前4个数据组成一个流
- Stream<String> s1 = list.stream().limit(4);
-
- //需求8:跳过2个数据组成一个流
- Stream<String> s2 = list.stream().skip(2);
-
- //需求9:合并需求1和需求2得到的流,并把结果在控制台输出
- //Stream.concat(s1,s2).forEach(System.out::println);
- System.out.println("--------");
-
- //需求10:合并需求7和需求8得到的流,并把结果在控制台输出,要求字符串元素不能重复
- Stream.concat(s1,s2).distinct().forEach(System.out::println);
- System.out.println("--------");
-
- //需求11:按照字母顺序把数据在控制台输出
- list.stream().sorted().forEach(System.out::println);
- System.out.println("--------");
-
- //需求12:按照字符串长度把数据在控制台输出
- // list.stream().sorted((String s3, String s4) -> s3.length()-s4.length()).forEach(System.out::println);
- list.stream().sorted((s3, s4) -> {
- int num1 = s3.length() - s4.length();
- int num2 = num1==0?s3.compareTo(s4):num1;
- return num2;
- }).forEach(System.out::println);
- System.out.println("--------");
-
- ArrayList<String> list2 = new ArrayList<>();
- list2.add("100");
- list2.add("200");
- list2.add("300");
- list2.add("400");
-
- //需求13:将集合中的字符串数据转换为整数之后再控制台输出
- list2.stream().map(Integer::parseInt).forEach(System.out::println);
- System.out.println("--------");
- list2.stream().mapToInt(Integer::parseInt).forEach(System.out::println);
- System.out.println("--------");
- int result = list2.stream().mapToInt(Integer::parseInt).sum();
- System.out.println(result);
- }
- }

控制台输出:
Stream流的常见终结操作方法
Consumer接口中的方法 void accept(T t):对给定的参数执行此操作
实例:
- public class StreamTest {
- public static void main(String[] args) {
- ArrayList<String> list = new ArrayList<String>();
-
- 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);
- }
- }

现在又两个ArrayList集合,分别存储6名男演员名称和6名女演员名称,要求完成如下的操作
实例:
- public class StreamTest {
- public static void main(String[] args) {
- ArrayList<String> manList = new ArrayList<String>();
- manList.add("刘德华");
- manList.add("周星驰");
- manList.add("周润发");
- manList.add("张家辉");
- manList.add("吴京");
- manList.add("成龙");
- ArrayList<String> womanList = new ArrayList<String>();
- womanList.add("柳岩");
- womanList.add("张曼玉");
- womanList.add("林青霞");
- womanList.add("范冰冰");
- womanList.add("王祖贤");
- womanList.add("林心如");
-
- //男演员只要名字为3个字的前三人
- Stream<String> manStream = manList.stream().filter(s -> s.length() == 3).limit(3);
-
- //女演员只要姓林的,并且不要第一个
- Stream<String> womanStream = womanList.stream().filter(s -> s.startsWith("林")).skip(1);
-
- //把过滤后的男演员姓名和女演员的姓名合并到一起
- Stream<String> stream = Stream.concat(manStream, womanStream);
-
- //把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据
- stream.map(Actor::new).forEach(p -> System.out.println(p.getName()));
-
- }
- }

控制台输出:
对数据使用Stream流的方式操作完毕后,我想把流中的数据收集到集合中,该怎么办呢?
Stream流的手机方法
工具类Collectors提供了具体的收集方式
实例:
- public class CollectTest {
- public static void main(String[] args) {
- ArrayList<String> list = new ArrayList<String>();
-
- list.add("张曼玉");
- list.add("周星驰");
- list.add("刘德华");
- list.add("张敏");
- list.add("张无忌");
-
- //需求1:得到名字为3个字的流
- Stream<String> listStream = list.stream().filter(s -> s.length() == 3);
-
- //需求2:把使用Stream流操作完毕的数据收集到List集合中并遍历
- List<String> names = listStream.collect(Collectors.toList());
- System.out.println(names);
-
-
- Set<Integer> set = new HashSet<Integer>();
- set.add(100);
- set.add(200);
- set.add(32340);
- set.add(10);
-
- Stream<Integer> setStream = set.stream().filter(s -> s > 20);
- Set<Integer> ages = setStream.collect(Collectors.toSet());
- System.out.println(ages);
-
- //定义一个字符串数组,每一个字符串数据由姓名数据和年龄数据组合而成
- String[] strArray = {"林青霞,40","周星驰,59","张曼玉,56"};
- //需求:得到年龄大于28的流
- Stream<String> arrayStream = Stream.of(strArray).filter(s -> Integer.parseInt(s.split(",")[1]) > 45);
- //需求:把使用Stream流操作完毕的数据收集到Map集合中并遍历,字符串中的姓名作键,年龄作值
- Map<String, String> map = arrayStream.collect(Collectors.toMap(s -> s.split(",")[0], s -> s.split(",")[1]));
- Set<String> keySet = map.keySet();
- for (String key :
- keySet) {
- String s = map.get(key);
- System.out.println(key + "," + s);
-
- }
-
- }
- }

控制台输出:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。