体验Stream流
需求:按照下面的要求完成集合的创建和遍历 1、创建一个集合,存储多个字符串元素 2、把集合中所有以"张"开头的元素存储到一个新的集合 3、把"张"开头的集合中的长度为3的元素存储到一个新的集合 4、遍历上一步得到的集合
总结:Stream流把真正的函数式编程风格引入到Java中。我们会在后面的学习中不断深入学习Stream流
体验Stream流的练习
xxxxxxxxxxpackage 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流的常见生成方式的练习
xxxxxxxxxxpackage 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);
}}