加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java 8 Stream API详解--转

发布时间:2020-12-14 06:22:01 所属栏目:Java 来源:网络整理
导读:原文地址:http://blog.csdn.net/chszs/article/details/47038607 8引入了全新的Stream API,此Stream与?I/O包里的InputStream和OutputStream是完全不同的概念,它不同于StAX对XML解析的Stream,也不同于Amazon Kinesis对实时处理的Stream。Stream API更像具

原文地址:http://blog.csdn.net/chszs/article/details/47038607

8引入了全新的Stream API,此Stream与?I/O包里的InputStream和OutputStream是完全不同的概念,它不同于StAX对XML解析的Stream,也不同于Amazon Kinesis对实时处理的Stream。Stream API更像具有Iterable的集合类,但行为和集合类又有所不同,它是对集合对象功能的增强,专注于对集合对象进行各种非常便捷、高效的聚合操作或大批量数据操作。

Stream API引入的目的在于弥补Java函数式编程的缺陷。对于很多支持函数式编程的语言,map()、reduce()基本上都内置到语言的标准库中了,不过,Java 8的Stream API总体来讲仍然是非常完善和强大,足以用很少的代码完成许多复杂的功能。

Java 8的Stream API充分利用Lambda表达式的特性,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错,但使用Stream API无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。

在Stream API中,一个流基本上代表一个元素序列,Stream API提供了丰富的操作函数来计算这些元素。以前我们在开发业务应用时,通常很多操作的实现是这样做的:我们使用循环对集合做遍历,针对集合中的元素实现各种操作,定义各种变量来实现目的,这样我们就得到了一大堆丑陋的顺序代码。

如果我们使用Stream API做同样的事情,使用Lambda表达式和其它函数进行抽象,可以使得代码更易于理解、更为干净。有了这些抽象,还可以做一些优化,比如实现并行等。

比如在控制台输出0~9的例子:注意需import java.util.stream.IntStream;

IntStream.range(0,10).forEach(value -> System.out.println(value));

注意需

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

List list = IntStream.range(1,100).boxed().collect(Collectors.toList());
System.out.println(list.stream().count());


<h3 id="3-计算列表中元素的平均数">
<a name="t5">3. 计算列表中元素的平均数

Double avarage = list.stream().collect(Collectors.averagingInt(item -> item));

List list = IntStream.range(1,100).boxed().collect(Collectors.toList());
IntSummaryStatistics iss = list.stream().collect(Collectors.summarizingInt(value -> value));
System.out.println(iss);

??输出结果:

IntSummaryStatistics{count=99,sum=4950,min=1,average=50.000000,max=99}

List list = IntStream.range(1,100).boxed().collect(Collectors.toList());
Map map = list.stream().collect(Collectors.toMap(p -> p,q->q*3));
System.out.println(map);

输出结果:

{1=3,2=6,3=9,4=12,5=15,6=18,7=21,8=24,9=27,10=30,11=33,12=36,13=39,14=42,15=45,16=48,17=51,18=54,19=57,20=60,21=63,22=66,23=69,24=72,25=75,26=78,27=81,28=84,29=87,30=90,31=93,32=96,33=99,34=102,35=105,36=108,37=111,38=114,39=117,40=120,41=123,42=126,43=129,44=132,45=135,46=138,47=141,48=144,49=147,50=150,51=153,52=156,53=159,54=162,55=165,56=168,57=171,58=174,59=177,60=180,61=183,62=186,63=189,64=192,65=195,66=198,67=201,68=204,69=207,70=210,71=213,72=216,73=219,74=222,75=225,76=228,77=231,78=234,79=237,80=240,81=243,82=246,83=249,84=252,85=255,86=258,87=261,88=264,89=267,90=270,91=273,92=276,93=279,94=282,95=285,96=288,97=291,98=294,99=297}

List list = new Random().ints(-100,100).limit(250).boxed().collect(Collectors.toList());
Optional max = list.stream().reduce(Math::max);
max.ifPresent(value -> System.out.println(value));

?String[] names = { "Fred Edwards","Anna Cox","Deborah Patterson","Ruth Torres","Shawn Powell","Rose Thompson","Rachel Barnes","Eugene Ramirez","Earl Flores","Janice Reed","Sarah Miller","Patricia Kelly","Carl Hall","Craig Wright","Martha Phillips","Thomas Howard","Steve Martinez","Diana Bailey","Kathleen Hughes","Russell Anderson","Theresa Perry" };
List ls = Arrays.asList(names).stream().filter(s -> s.startsWith("C")).collect(Collectors.toList());
System.out.println(ls.toString());

String[] names = { "Fred Edwards","Theresa Perry" };
Arrays.asList(names)
         .stream()
         .map(String::toUpperCase)
         .sorted().forEach(System.out::println);

public class Person {
    private String name;
    private int age;
public Person(String name,int age) {
    super();
    this.name = name;
    this.age = age;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public int getAge() {
    return age;
}

public void setAge(int age) {
    this.age = age;
}

@Override
public String toString() {
    return name;
}

}


<h3 id="2-根据年龄对person进行分组">
<a name="t13">2. 根据年龄对Person进行分组

Map> collect = persons.stream().collect(Collectors.groupingBy(Person::getAge));

Double collect = persons.stream().collect(Collectors.averagingInt(Person::getAge));

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读