Stream概念
代码示例
package com.zz.stream;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;/*** 使用Stream流* 找出姓张并且是三个字的名字*/
public class Test {public static void main(String args[]){List<String> names = new ArrayList <>();Collections.addAll(names, "张无忌", "赵四", "张三", "李四", "张缘结");System.out.println(names);//使用原始方法List<String> list = new ArrayList <>();for (String name:names) {if(name.startsWith("张") && name.length() == 3){list.add(name);}}System.out.println(list);//使用Stream流List<String> list1 = names.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).collect(Collectors.toList());System.out.println(list1);}
}
-
names.stream(): 这部分将
names
列表转换成一个流(Stream)。流是Java 8中引入的一个新特性,它允许你以声明性方式处理数据集合(如列表、集合等)。 -
filter(s -> s.startsWith("张")): 第一个
filter
方法用于过滤流中的元素。它接受一个Predicate
(谓词),该谓词是一个函数式接口,用于定义一个测试条件。在这里,谓词是一个lambda表达式s -> s.startsWith("张")
,它检查每个字符串是否以“张”开头。只有满足这个条件的字符串才会被保留在流中。 -
filter(s -> s.length() == 3): 第二个
filter
方法再次过滤流中的元素。它使用了另一个lambda表达式s -> s.length() == 3
作为谓词,该谓词检查每个字符串的长度是否为3。只有长度为3的字符串才会被保留在流中。
需要注意的是,这里连续调用了两次filter
方法。流中的每个元素首先会经过第一个filter
方法的检查,然后再经过第二个filter
方法的检查。只有同时满足这两个条件的元素才会被保留。
- collect(Collectors.toList()): 最后,
collect
方法用于将过滤后的流收集到一个新的列表中。Collectors.toList()
是一个收集器(Collector),它告诉collect
方法如何收集流中的元素。在这个例子中,它将流中的元素收集到一个新的List
中。
Stream流的使用步骤
1.获取Stream流
-
List集合获取Stream流
-
Map集合获取Stream流
-
Set集合获取Stream流
-
数组获取Stream流
代码示例
package com.zz.stream;import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;public class Test2 {public static void main(String args[]){//1.集合获取Stream流List<String> names = new ArrayList <>();Collections.addAll(names, "刘德华", "朱子晴", "朱德", "郭富城");List<String> list = names.stream().filter(s -> s.contains("德")).collect(Collectors.toList());System.out.println(list);//2.Set集合获取Stream流Set<String> set = new HashSet <>();Collections.addAll(set, "刘德华", "朱子晴", "朱德", "郭富城");Stream<String> stream = set.stream();stream.filter(s -> s.contains("朱")).forEach(s -> System.out.println(s));//使用Map集合获取Stream流Map<String, Double> map = new HashMap <>();map.put("白骨精", 145.9);map.put("牛魔王", 180.3);map.put("孙悟空", 156.4);/*** Map集合不能直接获取Stream流* 解决方法* 1.通过Set<String> keys = map.keySet();获取键流* Collection<Double> values = map.values();获取值流* 2.使用Entry封装键值对:Set<Map.Entry<String, Double>> entries = map.entrySet();*/Set<String> keys = map.keySet();Stream<String> ks = keys.stream();//获取到键的流Collection<Double> values = map.values();Stream<Double> vs = values.stream();Set<Map.Entry<String, Double>> entries = map.entrySet();Stream<Map.Entry<String, Double>> kvs = entries.stream();kvs.filter(e -> e.getKey().contains("牛")).forEach(s -> System.out.println(s.getKey() + "=" + s.getValue()));//数组获取Stream流String[] names2 = {"张护", "妞儿", "bab"};Stream<String> s1 = Arrays.stream(names2);Stream<String> s2 = Stream.of(names2);}
}
2.Stream常用的中间方法
3.Stream流常见的终结方法
注意:流只能收集一次