原文地址: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)); (编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|