Stream流的三类方法
生成Stream流的方式
Collection体系集合:使用默认方法stream()生成流, default Stream stream()
Map体系集合:把Map转成Set集合,间接的生成流
数组:通过Arrays中的静态方法stream生成流
同种数据类型的多个数据:通过Stream接口的静态方法of(T… values)生成流
代码演示
public class StreamDemo {public static void main(String[] args) {//Collection体系的集合可以使用默认方法stream()生成流List list = new ArrayList();Stream listStream = list.stream();Set set = new HashSet();Stream setStream = set.stream();//Map体系的集合间接的生成流Map map = new HashMap();Stream keyStream = map.keySet().stream();Stream valueStream = map.values().stream();Stream> entryStream = map.entrySet().stream();//数组可以通过Arrays中的静态方法stream生成流String[] strArray = {"hello","world","java"};Stream strArrayStream = Arrays.stream(strArray);//同种数据类型的多个数据可以通过Stream接口的静态方法of(T... values)生成流Stream strArrayStream2 = Stream.of("hello", "world", "java");Stream intStream = Stream.of(10, 20, 30);}
}
Stream流中间操作方法
概念
中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作
常见方法
方法名 | 说明 |
---|---|
Stream filter(Predicate predicate) | 用于对流中的数据进行过滤 |
Stream limit(long maxSize) | 返回此流中的元素组成的流,截取前指定参数个数的数据 |
Stream skip(long n) | 跳过指定参数个数的数据,返回由该流的剩余元素组成的流 |
static Stream concat(Stream a, Stream b) | 合并a和b两个流为一个流 |
Stream distinct() | 返回由该流的不同元素(根据Object.equals(Object) )组成的流 |
filter代码演示
public class StreamDemo01 {public static void main(String[] args) {//创建一个集合,存储多个字符串元素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);}
}
limit&skip代码演示
public class StreamDemo02 {public static void main(String[] args) {//创建一个集合,存储多个字符串元素ArrayList list = new ArrayList();list.add("林青霞");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);}
}
concat&distinct代码演示
public class StreamDemo03 {public static void main(String[] args) {//创建一个集合,存储多个字符串元素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() | 返回此流中的元素数 |
代码演示
public class StreamDemo {public static void main(String[] args) {//创建一个集合,存储多个字符串元素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 Collector toList() | 把元素收集到List集合中 |
public static Collector toSet() | 把元素收集到Set集合中 |
public static Collector toMap(Function keyMapper,Function valueMapper) | 把元素收集到Map集合中 |
代码演示
public class CollectDemo {public static void main(String[] args) {//创建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);}}
}