Java中Stream流详解
Java中Stream流详解
1、两种遍历集合方式的比较
代码语言:javascript代码运行次数:0运行复制package study.stream;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("张大哥");
list.add("李三哥");
list.add("张二哥");
list.add("马五弟");
list.add("张六弟");
//需求:出姓张的哥哥
//传统方法
for (String s : list) {
if(s.startsWith("张")&&("哥")){
println(s);
}
}
//stream流的方式
list.stream()
.filter((s)->s.startsWith("张"))
.filter((s)->("哥"))
.forEach(::println);
}
}
2、流式思想
个人理解的流式思想
Stream的作用是使对一些数据的操作更加方便、快捷;
就像工厂里的生产线对产品进行多步骤加工,每一步加工之后返回的还是产品本身,只不过是加工过的产品,然后继续下一步加工操作,就像上面的代码,每一行代码就相当于进行一次加工,加工后还是返回产品本身,所以可以直接进行下一个方法调用;
Stream流是一个来自数据源的元素队列
①元素是特定类型的对象,形成一个队列;(在java中Stream并不会存储数据,只是进行按需计算)
②数据源:流的来源。可以是集合、数组等;
和Collection操作不同,Stream操作还有两个基本特征:
①Pipelining:中间操作都会返回流本身;
②内部迭代:以前对集合的遍历都是通过Iterator迭代器进行的,这种叫外部迭代;Stream提供了内部迭代的方式,流可以直接调用遍历方法;
当使用一个流的时候通常包括三个基本步骤:
①获取数据源(Source);
②数据转换;
③执行操作获取想要的结果;
1、所有的Collection集合都可以通过stream方法获取流
代码演示:
代码语言:javascript代码运行次数:0运行复制 //一、把集合转换为Stream流
//list集合
List<String> list = new ArrayList<>();
Stream<String> s1 = list.stream();
//set集合
Set<String> set = new HashSet<>();
Stream<String> s2 = set.stream();
//map集合
Map<String,String> map = new HashMap<>();
//获取键,存储到一个set集合中
Set<String> set1 = map.keySet();
Stream<String> s = set1.stream();
//获取值,存储到一个Collection集合中
Collection<String> collection = map.values();
Stream<String> s4 = collection.stream();
//获取键值对(键与值的映射关系 entrySet)
Set<Map.Entry<String, String>> entrySet = ();
Stream<Map.Entry<String, String>> s5 = entrySet.stream();
2、Stream接口的静态方法of可以获取数组对应的流
代码演示:
代码语言:javascript代码运行次数:0运行复制 //二、把数组转换为Stream流
Integer[] arr = {1,2,,4,5};
Stream<Integer> stream = (arr);
String[] strings = {"你好!","Hello!","哈哈哈!"};
Stream<String> stream1 = (strings);
1、常用方法分为两类:
①延迟方法:
返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用(除了终结方法外,其他方法都是延迟方法);
②终结方法:
返回值类型不再是Stream接口自身的方法,因此不再支持类似StringBuilder那样的链式调用,本小节中终结方法包括count和forEach;
2、forEach遍历
方法:
void forEach(Cumer<? super T> action);
该方法接收一个Cumer接口函数,会将每一个流元素交给该方法处理;
代码示例:
代码语言:javascript代码运行次数:0运行复制 Stream<String> stream = ("你好!","Hello!","哈哈!");
stream.forEach(::println);
//你好!
//Hello!
//哈哈!
、fliter过滤
方法:
代码语言:javascript代码运行次数:0运行复制Stream<T> fliter(Predicate<? super T> predicate);
作用:
将一个流转换为一个子集流;
Predicate接口是用于判断的接口;
代码实现:
代码语言:javascript代码运行次数:0运行复制 Stream<String> stream = ("你好!","Hello!","哈哈!");
Stream<String> stream1 = stream.filter((word)->word.startsWith("你"));
stream1.forEach(::println);//你好!
注意:
Stream流只能使用一次;
代码说明:
代码语言:javascript代码运行次数:0运行复制 Stream<String> stream = ("你好!","Hello!","哈哈!");
Stream<String> stream1 = stream.filter((word)->word.startsWith("你"));
stream1.forEach(::println);//你好!
//Stream流是管道流,只能使用一次
stream1.forEach(::println);//报错
//java.lang.IllegalStateException: stream has
// already been operated upon or closed
4、map映射
方法:
代码语言:javascript代码运行次数:0运行复制<R> Stream<R> map(Function<? super T, ? extends R> mapper );
作用:
将流中的元素映射到另一个流中;
Function接口的抽象方法R apply(T t)可以将T类型转换成R类型,而这种转换的动作,成为映射;
演示:
代码语言:javascript代码运行次数:0运行复制 Stream<String> stream = ("1","2","");
Stream<Integer> stream1 = (Integer::parseInt);
stream1.forEach(::println);
//1
//2
//
5、count计数
方法:
代码语言:javascript代码运行次数:0运行复制long count
作用:
统计个数,相当于集合的size方法;
代码演示:
代码语言:javascript代码运行次数:0运行复制 Stream<String> stream = ("1","2","");
println(());//
6、limit截取前个元素
方法:
代码语言:javascript代码运行次数:0运行复制Stream<T> limit(long maxSize);
作用:
截取前个元素;
代码实现:
代码语言:javascript代码运行次数:0运行复制 Stream<String> stream = ("1","2","");
stream.limit().forEach(::println);
//1
//2
//
7、skip跳过前个元素
方法:
代码语言:javascript代码运行次数:0运行复制Stream<T> skip(long n);
作用:
跳过前个元素;
代码实现:
代码语言:javascript代码运行次数:0运行复制 Stream<String> stream = ("1","2","");
stream.skip(2).forEach(::println);//
8、concat流的合并
方法:
代码语言:javascript代码运行次数:0运行复制static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
作用:
将两个流合并成一个流;
代码实现:
代码语言:javascript代码运行次数:0运行复制 Stream<String> stream1 = ("1","2","");
Stream<String> stream2 = ("4","5","6");
(stream1,stream2).forEach(::println);
//1
//2
//
//4
//5
//6
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2025-01-06,如有侵权请联系 cloudcommunity@tencent 删除javastream产品集合接口 #感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格
推荐阅读
留言与评论(共有 8 条评论) |
本站网友 自助餐 | 9分钟前 发表 |
forEach遍历方法:void forEach(Cumer<? super T> action);该方法接收一个Cumer接口函数 | |
本站网友 settimeout用法 | 16分钟前 发表 |
本站网友 祛除颈纹 | 20分钟前 发表 |
"哈哈哈!"}; Stream<String> stream1 = (strings);三 | |
本站网友 无力挽回 | 1分钟前 发表 |
println);//报错 //java.lang.IllegalStateException | |
本站网友 长脸适合的发型 | 6分钟前 发表 |
如有侵权请联系 cloudcommunity@tencent 删除前往查看javastream产品集合接口 | |
本站网友 脏辫 | 30分钟前 发表 |
因此不再支持类似StringBuilder那样的链式调用 | |
本站网友 绥滨县 | 23分钟前 发表 |
map映射方法:代码语言:javascript代码运行次数:0运行复制<R> Stream<R> map(Function<? super T |