- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章Java8新特性Stream流实例详解由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
什么是Stream流?
Stream流是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列.
Stream的优点:声明性,可复合,可并行。这三个特性使得stream操作更简洁,更灵活,更高效.
Stream的操作有两个特点:可以多个操作链接起来运行,内部迭代.
Stream可分为并行流与串行流,Stream API 可以声明性地通过 parallel() 与sequential() 在并行流与顺序流之间进行切换。串行流就不必再细说了,并行流主要是为了为了适应目前多核机器的时代,提高系统CPU、内存的利用率,并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。java1.8并行流使用的是fork/join框架,关于fork/join框架可参考http://ifeve.com/talk-concurrency-forkjoin/学习.
注意 :
* 1、Stream不会自己存储数据.
* 2、Stream不会改变原对象,他们会返回一个新的Stream.
* 3、Stream操作是延迟的,他们会等到需要的结果时才执行.
* 4、使用并行流并不一定会提高效率,因为jvm对数据进行切片和切换线程也是需要时间的.
本文主要讲 Stream的3个操作步骤:1、创建Stream 2、中间操作3、终止操作.
创建Stream 。
创建Stream,就是将一个数据源 (如:集合、数组)转化为一个流.
1、通过Collection系列提供的stream()(串行) 或parallelStream()(并行)获取数据流.
2、通过Arrays中的静态方法stream() 获取数据流.
3、通过Stream类中的静态方法of()获取数据流.
1
2
3
4
5
6
7
8
9
|
//1、通过Collection系列提供的stream()(串行) 或parallelStream()(并行)获取
List<String> list =
new
ArrayList<>();
Stream<String> stream1 = list.stream();
//串行流
Stream<String> stream2 = list.parallelStream();
//并行流
//2、通过Arrays中的静态方法stream() 获取数据流
User[] u =
new
User[
2
];
Stream<User> stream3 = Arrays.stream(u);
//3、通过Stream;类中的静态方法of()
Stream<String> stream4 = Stream.of(
"11"
,
"2"
);
|
中间操作 。
中间操作,即对数据源进行一系列的操作处理。 多个中间操作可以连接起来性格一条流水线,除非流水线上触发器终止操作,否则中间操作不会执行任何的处理,而是在终止操作时一次性全部处理,成为惰性求值.
筛选和切片 。
1、filter(predicate)-接收lambda,从流中排除某些元素.
2、limit(n)-截断流,使其元素不超过给定数量.
3、skip(n)-跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流,与limit(n)互补.
4、distinct-筛选,通过流所生成元素的hashcode()和equals()去重复元素.
1
2
3
4
5
6
7
8
9
10
11
12
|
/**
* 打印年龄大于18的前4位用户信息(不重复)
* 并跳过第1个用户
*/
@Test
public
void
test1(){
list.stream()
.filter((x)->x.getAge()>
18
)
.distinct()
.limit(
4
)
.skip(
1
).forEach(System.out::println);
}
|
映射 。
1、map,接收Lambda,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每一个元素上,并将其映射成一个新的元素.
2、mapToDouble/mapToInt/mapToLong,接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的DoubleStream/IntStream/LongStream.
3 、flatMap,接收一个函数作为参数,将流中的每个值都换成一个流,然后把流连接成一个流.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
@Test
public
void
test2(){
///map
list.stream().map(User::getName)
.forEach(System.out::println);
//flatMap
List<List<User>> list1 =
new
ArrayList<>();
list1.add(list);
list1.stream().flatMap(Stream::getNames)
.forEach(System.out::println);
}
public
static
Stream<String> getNames(List<User> list){
List<String> list1 =
new
ArrayList<String>();
for
(User user : list) {
list1.add(user.getName());
}
return
list1.stream();
}
|
排序 。
1、sorted(),产生一个新流,其中按自然顺序排序.
2、sorted(Comparator),产生一个新流,其中按比较器顺序排序.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@Test
public
void
test3(){
List<String> list =Arrays.asList(
"aa"
,
"bb"
,
"cc"
,
"dd"
);
list.stream().sorted()
.forEach(System.out::println);
//
list.stream().sorted((x,y) -> {
if
(x.equals(y)){
return
1
;
}
else
{
return
-
1
;
}
} ).forEach(System.out::println);
}
|
终止操作 。
终止操作是执行中间操作链,并产生结果(一个新流),数据源本身并不受影响,其结果可以是任何不是流的值.
查找与匹配 。
1、allMatch,检查是否匹配所有元素。 2、anyMatch,检查是否至少匹配一个元素。 3、noneMatch,检查是否没有匹配所有元素。 4、findFirst,返回第一个元素。 5、findAny,返回当前流中的任意元素。 6、count,返回流中元素的总数。 7、 max,返回流中最大值。 8、min,返回流中最小值。 9、froEach(Consumer c) 内部迭代.
1
2
3
4
5
6
7
8
9
10
11
|
@Test
public
void
test4(){
boolean
b = list.stream().
noneMatch((e) ->
e.getName().equals(
"zhao"
));
System.out.println(b);
Optional<User> op = list.parallelStream()
.filter((x) -> x.getAge() ==
18
)
.findAny();
System.out.println(op.get());
}
|
归约 。
reduce,可以将流中的值反复结合起来,得到一个值.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
@Test
public
void
test5(){
//转List
List<String> list1 =list.stream()
.map(User::getName)
.collect(Collectors.toList()) ;
list1.forEach(System.out::println);
//转HashSet
HashSet<String> set = list.stream().
map(User::getName)
.collect(Collectors.toCollection(HashSet::
new
));
set.forEach(System.out::println);
//总数
Long count = list.stream()
.collect(Collectors.counting());
System.out.println(count);
//平均年龄
double
avAge = list.stream()
.collect(Collectors.averagingInt(User::getAge));
System.out.println(avAge);
//总年龄
int
toAge = list.stream()
.collect(Collectors.summingInt(User::getAge));
System.out.println(toAge);
//最大值
Optional<User> u = list.stream()
.collect(Collectors.maxBy((e1,e2)
-> Integer.compare(e1.getAge(),e2.getAge() )));
System.out.println(u);
//平均年龄
IntSummaryStatistics collect = list.stream()
.collect(Collectors.summarizingInt(User::getAge));
System.out.println(collect.getAverage());
//分组
Map<Integer, List<User>> l= list.stream()
.collect(Collectors.groupingBy(User::getAge));
System.out.println(l);
//多级分组
Map<Integer,Map<String,List<User>> > ls= list.stream()
.collect(Collectors.groupingBy(
User::getAge,Collectors.groupingBy(User::getSex)));
System.out.println(ls);
//分区
Map<Boolean,List<User>> map= list.stream()
.collect(Collectors.partitioningBy((x)
-> x.getAge()>
18
));
System.out.println(map);
//连接字符串
String str = list.stream().map(User::getName)
.collect(Collectors.joining(
","
,
"-"
,
"-"
));
System.out.println(str);
}
|
总结 。
以上所述是小编给大家介绍的Java8新特性Stream流实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:http://blog.csdn.net/l18637220680/article/details/78323998?utm_source=tuicool&utm_medium=referral 。
最后此篇关于Java8新特性Stream流实例详解的文章就讲到这里了,如果你想了解更多关于Java8新特性Stream流实例详解的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
这个问题在这里已经有了答案: Why filter() after flatMap() is "not completely" lazy in Java streams? (8 个答案) 关闭 6
我正在创建一个应用程序来从 Instagram 收集数据。我正在寻找像 Twitter 流 API 这样的流 API,这样我就可以自动实时收集数据而无需发送请求。 Instagram 有类似的 API
我正在使用 Apache Commons 在 Google App Engine 中上传一个 .docx 文件,如此链接中所述 File upload servlet .上传时,我还想使用 Apach
我尝试使用 DynamoDB 流和 AWS 提供的 Java DynamoDB 流 Kinesis 适配器捕获 DynamoDB 表更改。我正在 Scala 应用程序中使用 AWS Java 开发工具
我目前有一个采用 H.264 编码的 IP 摄像机流式视频 (RTSP)。 我想使用 FFmpeg 将此 H.264 编码流转换为另一个 RTSP 流,但 MPEG-2 编码。我该怎么做?我应该使用哪
Redis 流是否受益于集群模式?假设您有 10 个流,它们是分布在整个集群中还是都分布在同一节点上?我计划使用 Redis 流来实现真正的高吞吐量(200 万条消息/秒),所以我担心这种规模的 Re
这件事困扰了我一段时间。 所以我有一个 Product 类,它有一个 Image 列表(该列表可能为空)。 我想做 product.getImages().stream().filter(...) 但
是否可以使用 具有持久存储的 Redis 流 还是流仅限于内存数据? 我知道可以将 Redis 与核心数据结构的持久存储一起使用,但我已经能够理解是否也可以使用 Redis 中的流的持久存储。 最佳答
我开始学习 Elixir 并遇到了一个我无法轻松解决的挑战。 我正在尝试创建一个函数,该函数接受一个 Enumerable.t 并返回另一个 Enumerable.t ,其中包含下 n 个项目。它与
我试图从 readLine 调用创建一个无限的字符串流: import java.io.{BufferedReader, InputStreamReader} val in = new Buffere
你能帮我使用 Java 8 流 API 编写以下代码吗? SuperUser superUser = db.getSuperUser; for (final Client client : super
我正在尝试服用补品routeguide tutorial,并将客户端变成rocket服务器。我只是接受响应并将gRPC转换为字符串。 service RouteGuide { rpc GetF
流程代码可以是run here. 使用 flow,我有一个函数,它接受一个键值对对象并获取它的值 - 它获取的值应该是字符串、数字或 bool 值。 type ValueType = string
如果我有一个函数返回一个包含数据库信息的对象或一个空对象,如下所示: getThingFromDB: async function(id:string):Promise{ const from
我正在尝试使用javascript api和FB.ui将ogg音频文件发布到流中, 但是我不知道该怎么做。 这是我给FB.ui的电话: FB.ui( { method: '
我正在尝试删除工作区(或克隆它以使其看起来像父工作区,但我似乎两者都做不到)。但是,当我尝试时,我收到此消息:无法删除工作区 test_workspace,因为它有一个非空的默认组。 据我所知,这意味
可以使用 Stream|Map 来完成此操作,这样我就不需要将结果放入外部 HashMap 中,而是使用 .collect(Collectors.toMap(...)); 收集结果? Map rep
当我们从集合列表中获取 Stream 时,幕后到底发生了什么?我发现很多博客都说Stream不存储任何数据。如果这是真的,请考虑代码片段: List list = new ArrayList(); l
我对流及其工作方式不熟悉,我正在尝试获取列表中添加的特定对象的出现次数。 我找到了一种使用Collections来做到这一点的方法。其过程如下: for (int i = 0; i p.conten
我希望将一个 map 列表转换为另一个分组的 map 列表。 所以我有以下 map 列表 - List [{ "accId":"1", "accName":"TestAcc1", "accNumber
我是一名优秀的程序员,十分优秀!