Stream流编程
最佳答案 问答题库438位专家为你答疑解惑
目录
获取流
Stream流的常用方法:
count
.filter方法:
forEach方法
limit方法
map方法
skip方法
concat方法
收集Stream流
流格式
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<E> 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流的常用方法:
终结方法:返回值类型不再是Stream接口本身类型的方法,例如:forEach方法和count方法
非终结方法/延迟方法:返回值类型仍然是Stream接口自身类型的方法,除了终结方法都是延迟方法。例如:filter,limit,skip,map,conat
count
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
.filter方法:
Stream<T> filter(Predicate<? super ?> predicate); 过滤出满足条件的元素
参数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);});
forEach方法
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);});输出结果:张老三张小三李四赵五张六王八
limit方法
Stream<T> limit(long maxSize); 取用前几个元素
注意:
参数是一个long 类型,如果流的长度大于参数,则进行截取;否则不进行操作
// 获取流的长度Stream<String> stream1 = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");// 需求:保留前三个元素stream1.limit(3).forEach((String name)->{System.out.println("流中的前三个元素是:" + name);});输出结果:流中的前三个元素是:张老三流中的前三个元素是:张小三流中的前三个元素是:李四
map方法
<r> Stream <R> map(Function<? super T,? exception R> mapper; 参数Function<T,R>:函数式接口,抽象方法:R apply(T t); Function<T,R>:其实就是一个类型转换接口(T和R的类型可以一致,也可以不一致)
// 获取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类型的元素逐一输出});输出结果:1122334455
skip方法
Stream<T> skip(long n); 跳过前几个元素 注意: 如果流的当前长度大于n,则跳过前n个,否则将会得到一个长度为0的空流
// 获取stream流Stream<String> stream = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");stream.skip(3).forEach((String name)->{System.out.println("跳过前三个,打印剩下的" + name);});输出结果:跳过前三个,打印剩下的赵五跳过前三个,打印剩下的刘六跳过前三个,打印剩下的王七
concat方法
public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b) –> 合并两个流
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流
Stream流中提供了一个方法,可以把流中的数据收集到单例集合中
<R, A> R collect(Collector<? super T, A, R> collector);
把流中的数据手机到单列集合中 返回值类型是R。R指定为什么类型,就是手机到什么类型的集合 参数Collector<? super T, A, R>中的R类型,决定把流中的元素收集到哪个集合中 参数Collector如何得到 ?,
可以使用 java.util.stream.Collectors工具类中的静态方法:
– public static <T> Collector<T, ?, List<T>> toList():
转换为List集合 – public static <T> Collector<T, ?, Set<T>> toSet() :转换为Set集合
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);
99%的人还看了
相似问题
- Kotlin学习——kt里的集合,Map的各种方法之String篇
- Office文件在线预览大全-Word文档在线预览的实现方法-OFD文档在线预览-WPS文件在线预览
- composer切换全局镜像源的方法
- Python通过selenium调用IE11浏览器报错解决方法
- 测试用例的设计方法(全):正交实验设计方法|功能图分析方法|场景设计方发
- Java8新特性 ----- Lambda表达式和方法引用/构造器引用详解
- C#中抽象类、抽象方法和接口暨内联临时变量的精彩表达
- ChatGLM2 大模型微调过程中遇到的一些坑及解决方法(更新中)
- 类方法,静态方法和实例方法的区别及应用场景
- 【链表的说明、方法---顺序表与链表的区别】
猜你感兴趣
版权申明
本文"Stream流编程":http://eshow365.cn/6-11357-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!
- 上一篇: Linux —— 线程
- 下一篇: Redis模块五:持久化