1,首先,tasks集合被转换成steam表示;其次,在steam上的filter操作会过滤掉所有CLOSED的task;第三,mapToInt操作基于每个task实例的Task::getPoints方法将task流转换成Integer集合;最后,通过sum方法计算总和,得出最后的结果
import java.util.Arrays;
import java.util.Collection;enum Status {
OPEN, CLOSED
};
class Task {
private final Status status;
private final Integer points;
Task(final Status status, final Integer points) {
this.status = status;
this.points = points;
}
public Integer getPoints() {
return points;
}
public Status getStatus() {
return status;
}
@Override
public String toString() {
return String.format("[%s, %d]", status, points);
}
}
public class StreamsNewItem {
public static void main(String[] args) {
final Collection<Task> tasks = Arrays.asList(new Task(Status.OPEN, 5), new Task(Status.OPEN, 13),
new Task(Status.CLOSED, 8));
final long totalPointsOfOpenTasks = tasks.stream().filter(task -> task.getStatus() == Status.OPEN)
.mapToInt(Task::getPoints).sum();
System.out.println("Total points: " + totalPointsOfOpenTasks);
}
}
2,并行处理(parallel processing)
在上面的main中添加
final double totalPoints = tasks
.stream().parallel()
.map( task -> task.getPoints() ) // or map( Task::getPoints )
.reduce( 0, Integer::sum );
System.out.println( "Total points (all tasks): " + totalPoints );
Total points (all tasks): 26.0
这个就是并行处理的过程,,上面的实现是一个类似于Hadoop中的MapReduce原理
3,分组
final Map< Status, List< Task > > map = tasks
.stream()
.collect( Collectors.groupingBy( Task::getStatus ) );
System.out.println( map );
在main中添加如下代码可以看到分组是如何进行的,结果显示为:
{CLOSED=[[CLOSED, 8]], OPEN=[[OPEN, 5], [OPEN, 13]]}
最后,后续其他特性不做介绍,由于自己项目需求,需要看看关于java8,StreamAPI的parallel的如何进行并行处理的,所以就看了相关的关于StreamAPI特性,本文摘抄自:https://blog.csdn.net/u014470581/article/details/54944384
PS:由于并行处理流属于多线程的形式,所以List最好使用List<Integer> parallelStorage =
Collections.synchronizedList(new ArrayList<Integer>());