【重学Java】Stream流

Stream流 体验Stream流【理解】

案例需求

按照下面的要求完成集合的创建和遍历

创建一个集合,存储多个字符串元素

把集合中所有以"张"开头的元素存储到一个新的集合

把"张"开头的集合中的长度为3的元素存储到一个新的集合

遍历上一步得到的集合

原始方式示例代码

public class StreamDemo { public static void main(String[] args) { //创建一个集合,存储多个字符串元素 ArrayList<String> list = new ArrayList<String>(); list.add("林青霞"); list.add("张曼玉"); list.add("王祖贤"); list.add("柳岩"); list.add("张敏"); list.add("张无忌"); //把集合中所有以"张"开头的元素存储到一个新的集合 ArrayList<String> zhangList = new ArrayList<String>(); for(String s : list) { if(s.startsWith("张")) { zhangList.add(s); } } // System.out.println(zhangList); //把"张"开头的集合中的长度为3的元素存储到一个新的集合 ArrayList<String> threeList = new ArrayList<String>(); for(String s : zhangList) { if(s.length() == 3) { threeList.add(s); } } // System.out.println(threeList); //遍历上一步得到的集合 for(String s : threeList) { System.out.println(s); } System.out.println("--------"); //Stream流来改进 list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(s -> System.out.println(s)); } }

Stream流的好处

直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流、过滤姓张、过滤长度为3、逐一打印

Stream流把真正的函数式编程风格引入到Java

代码简洁

Stream流的常见生成方式【应用】

Stream流的思想

image

Stream流的三类方法

获取Stream流

创建一条流水线,并把数据放到流水线上准备进行操作

中间方法

流水线上的操作

一次操作完毕之后,还可以继续进行其他操作

终结方法

一个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<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<String, Integer>(); Stream<String> keyStream = map.keySet().stream(); Stream<Integer> valueStream = map.values().stream(); Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream(); //数组可以通过Arrays中的静态方法stream生成流 String[] strArray = {"hello","world","java"}; Stream<String> strArrayStream = Arrays.stream(strArray); //同种数据类型的多个数据可以通过Stream接口的静态方法of(T... values)生成流 Stream<String> strArrayStream2 = Stream.of("hello", "world", "java"); Stream<Integer> 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) )组成的流(自定义数据类型重写equals和hashCode  

filter原理

ArrayList list = new ArrayList(List.of(1,2,3,4)); list.stream().filter(new Predicate() { @Override public boolean test(Object o) { return false; } }); //Predicate中有一个抽象方法test可以使用匿名内部类或者lambda表达式 //filter方法获取流中的每一个数据 //而test中的s,依次表示流中的每一个数据 //我们只需要在流中对s进行判断就行了 //如果判断结果为true,则当前结果留下 //如果判断结果为false,则当前结果不要

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyspwj.html