体验Stream流
需求:按照下面的要求完成集合的创建和遍历 1、创建一个集合,存储多个字符串元素 2、把集合中所有以"张"开头的元素存储到一个新的集合 3、把"张"开头的集合中的长度为3的元素存储到一个新的集合 4、遍历上一步得到的集合
总结:Stream流把真正的函数式编程风格引入到Java中。我们会在后面的学习中不断深入学习Stream流
体验Stream流的练习
xxxxxxxxxx
package ch26;
import java.util.ArrayList;
public class a_1_1测试 {
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<String>();
//增强for来遍历上面的list集合。如果有张开头的数据,就把该数据存储到zhangList集合
for(String s : list){
if(s.startsWith("张")){//如果遍历到list集合中的数据是以张开头的
zhangList.add(s);
}
}
System.out.println(zhangList);//输出张开头的字符串数据,输出的是集合
System.out.println("-------");
//把"张"开头的集合中的长度为3的元素存储到一个新的集合
ArrayList<String> threeList = new ArrayList<String>();
//使用增强for来遍历上面的zhangList集合。如果有长度为3的数据,就把该数据存储到threeList集合
for(String s : zhangList){
if(s.length()==3){
threeList.add(s);
}
}
System.out.println(threeList);//输出长度为三的以张开头的字符串数据,输出的是集合
System.out.println("-------");
//使用增强for来遍历上面的threeList集合
for(String s : threeList){
System.out.println(s);//输出的是字符串
}
System.out.println("--------------------------");
//--------------------------------------------------------------------------------------------------------------
//上面那些过滤操作的代码太长了,能不能简化一下呢。解决:使用我们马上要学的Stream流即可
//先通过list生成Stream流,如下
//先过滤出在list集合中以张开头的字符串数据,在以张开头的基础上,判断长度是否等于3,最后使用forEach输出满足条件的字符串数据
//注意forEach接口是消费型接口。filter方法是过滤出以张开头的数据,再filter过滤出长度为三的数据。forEach是对数据做出操作
list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(s-> System.out.println(s));
System.out.println("-------");
//上面那行也可以使用方法引用进行优化,如下
list.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3).forEach(System.out::println);
//总结:Stream流可以用很少很少的代码实现某些操作。Stream流是跟Lambda表达式一起使用的
}
}
Stream流的常见生成方式
Stream流的三种常见生成方式:
1、Collection体系的集合可以使用默认方法stream()生成流,例如default Stream
Stream流的常见生成方式的练习
xxxxxxxxxx
package ch26;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Stream;
public class a_2_1测试 {
public static void main(String[] args) {
//1、Collection体系的集合可以使用默认方法stream()生成流,例如default Stream<E> stream()
//Collection体系的集合指的是List和Set集合,如下
List<String> list = new ArrayList<String>();
Stream<String> listStream = list.stream();
Set<String> set = new HashSet<String>();
Stream<String> setStream = set.stream();
//-----------------------------------------------------------------------------------------
//2、Map体系的集合间接的生成流。Map体系的集合不能直接生成流,但是可以间接生成键、值、键值对的流
Map<String,Integer> map = new HashMap<String,Integer>();
//使用keySet方法得到键的Set集合,此时这个Set集合就可以调用stream流的方法了。键对应的流
Stream<String> keyStream = map.keySet().stream();
//使用values方法得到值的Collection集合,此时这个Collection集合就可以调用stream流的方法了。值对应的流
Stream<Integer> valueStream = map.values().stream();
//使用entrySet方法将原有Map集合中的键值作为一个整体,即键值对,返回的是Set集合。键值对的对象对应的流
Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();
//------------------------------------------------------------------------------------------
//3、数组可以通过Stream接口的静态方法of(T...values)生成流
String[] strArray = {"hello","world","java"};//定义一个数组
Stream<String> strArrayStream = Stream.of(strArray);
//注意上面的of里面的是可变参数,我们可不可以直接传一个可变参数呢,如下
Stream<String> strArrayStream2 = Stream.of("hello2", "world2", "java2");//这一行和上面那一行的效果是一样的
//int类型对应Stream流我们同样可以实现,如下
Stream<Integer> intStream = Stream.of(10, 20, 30);
}
}