目录
流格式
- Stream<T> filter(Predicate<? super T> predicate);
- -----> 参数:public interface Predicate<T> (函数式接口)
- ----> 抽象方法:boolean test(T t);
- -----> 参数:public interface Consumer<T> (函数式接口)
- ----> 抽象方法:boolean test(T t);
根据集合来获取:
根据Collection获取流:
Collection接口中有一个stream()方法,可以获取流
default Stream stream()
Stream<String> stream1 = list.stream();
- // 创建Map集合
- Map<Integer,String> map = new HashMap<>();
- map.put(1,"张老三");
- map.put(2,"张小三");
- map.put(3,"李四");
- map.put(4,"赵五");
- map.put(5,"张六");
- map.put(6,"王八");
-
- // 3.1根据Map集合的键获取流
- Set<Integer> map1 = map.keySet();
- Stream<Integer> stream3 = map1.stream();
- // 3.2根据Map集合的值获取流
- Collection<String> map2 = map.values();
- Stream<String> stream4 = map2.stream();
- // 3.3根据Map集合的键值对对象获取瑞
- Set<Map.Entry<Integer, String>> map3 = map.entrySet();
- Stream<Map.Entry<Integer, String>> stream5 = map3.stream();
- // 根据数组获取流
- String[] arr = {"张颜宇","张三","李四","赵五","刘六","王七"};
- Stream<String> stream6 = Stream.of(arr);
终结方法:返回值类型不再是Stream接口本身类型的方法,例如:forEach方法和count方法
非终结方法/延迟方法:返回值类型仍然是Stream接口自身类型的方法,除了终结方法都是延迟方法。例如:filter,limit,skip,map,conat
- List<String> list = new ArrayList<>();
- list.add("张老三");
- list.add("张小三");
- list.add("李四");
- list.add("赵五");
- list.add("张六");
- list.add("王八");
-
- long count = list.stream().count();
- System.out.println("集合中的元素个数是:" + count);
-
- 输出结果:
- 集合中的元素个数是:6
Stream
参数Predicate:函数式接口,抽象方法:boolean test (T t)
Predicate接口:是一个判断接口
- // 获取stream流
- Stream<String> stream = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
- // 需求:过去出姓张的元素
- stream.filter((String name)->{
- return name.startsWith("张");
- }).forEach((String name)->{
- System.out.println("流中的元素" + name);
- });
void forEach(Consumer super T> action):逐一处理流中的元素 参数 Consumer super T> action:函数式接口,只有一个抽象方法:void accept(T t);
注意:
1.此方法并不保证元素的逐一消费动作在流中是有序进行的(元素可能丢失)
2.Consumer是一个消费接口(可以获取流中的元素进行遍历操作,输出出去),可以使用Lambda表达式
- List<String> list = new ArrayList<>();
- list.add("张老三");
- list.add("张小三");
- list.add("李四");
- list.add("赵五");
- list.add("张六");
- list.add("王八");
-
- // 函数模型:获取流 --> 注意消费流中的元素
- list.stream().forEach((String name)->{
- System.out.println(name);
- });
-
- 输出结果:
- 张老三
- 张小三
- 李四
- 赵五
- 张六
- 王八
Stream
注意:
参数是一个long 类型,如果流的长度大于参数,则进行截取;否则不进行操作
- // 获取流的长度
- Stream<String> stream1 = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
- // 需求:保留前三个元素
- stream1.limit(3).forEach((String name)->{
- System.out.println("流中的前三个元素是:" + name);
- });
-
- 输出结果:
- 流中的前三个元素是:张老三
- 流中的前三个元素是:张小三
- 流中的前三个元素是:李四
- // 获取Stream流
- Stream<String> stream1 = Stream.of("11","22","33","44","55");
- // 需求:把stream1流中的元素转换为int类型
- stream1.map((String s)->{
- return Integer.parseInt(s); // 将String类型的s进行转换为Integer类型的元素,并返回
- }).forEach((Integer i)->{
- System.out.println(i); // 将转换后的int类型的元素逐一输出
- });
-
- 输出结果:
- 11
- 22
- 33
- 44
- 55
Stream
- // 获取stream流
- Stream<String> stream = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
-
- stream.skip(3).forEach((String name)->{
- System.out.println("跳过前三个,打印剩下的" + name);
- });
-
- 输出结果:
- 跳过前三个,打印剩下的赵五
- 跳过前三个,打印剩下的刘六
- 跳过前三个,打印剩下的王七
public static
- Stream<String> stream1 = Stream.of("11","22","33","44","55");
- Stream<String> stream2 = Stream.of("张颜宇", "张三", "李四", "赵五", "刘六", "王七");
-
- // 需求:合并两个流
- Stream<String> stream = Stream.concat(stream1,stream2);
- stream.forEach((String name)->{
- System.out.print(name);
- });
-
- 输出结果:
- 1122334455张颜宇张三李四赵五刘六王七
Stream流中提供了一个方法,可以把流中的数据收集到单例集合中
把流中的数据手机到单列集合中 返回值类型是R。R指定为什么类型,就是手机到什么类型的集合 参数Collector super T, A, R>中的R类型,决定把流中的元素收集到哪个集合中 参数Collector如何得到 ?,
可以使用 java.util.stream.Collectors工具类中的静态方法:
– public static
转换为List集合 – public static
- List<String> list2 = new ArrayList<>();
- list2.add("张老三");
- list2.add("张小三");
- list2.add("李四");
- list2.add("赵五");
- list2.add("张六");
- list2.add("王八");
-
- // 需求:过滤出姓张的并且长度为3的元素
- Stream<String> stream = list2.stream().filter((String name) -> {
- return name.startsWith("张");
- }).filter((String name) -> {
- return name.length() == 3;
- });
-
- // stream 收集到单列集合中
- List<String> list = stream.collect(Collectors.toList());
- System.out.println(list);
-
- // stream 手机到单列集合中
- Set<String> set = stream.collect(Collectors.toSet());
- System.out.println(set);