代码示例 import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class Streams {
private enum Status{
OPEN,CLOSE;
}
private static final class Task{
private Status status;
private Integer points;
Task(Status status,Integer points){
this.status = status;
this.points = points;
}
public Status getStatus(){
return status;
}
public Integer getPoints(){
return points;
}
public String toString(){
return String.format("[%s,%d]", status,points);
}
}
public static void main(String[] args) throws IOException {
//初始化tasks
final Collection tasks = Arrays.asList(new Task(Status.OPEN,5)
,new Task(Status.OPEN,15),new Task(Status.CLOSE,10));
//过滤
final long totalPointsOfOpenTasks = tasks.
stream()
.filter( task -> task.getStatus() == Status.OPEN)
.mapToInt( Task::getPoints).sum();
System.out.println(totalPointsOfOpenTasks);//20
//分组
Map> map = tasks.stream().collect(Collectors.groupingBy(Task :: getStatus));
System.out.println(map);
System.out.println(map.get(Status.OPEN));
System.out.println(map.get(Status.CLOSE));
//计算总和
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 );
//计算整个集合中每个task分数(或权重)的平均值
final Collection result = tasks.stream().mapToInt(Task :: getPoints).asLongStream()
.mapToDouble(points -> points / totalPoints)
.boxed()
.mapToLong(weigth -> (long)(weigth * 100))
.mapToObj(percentage -> percentage + "%")
.collect(Collectors.toList());
System.out.println(result);
//读取文件
String filename = "E:\\code\\123\\src\\test\\java\\AppTest.java";
final Path path = new File( filename ).toPath();
try( Stream< String > lines = Files.lines( path, StandardCharsets.UTF_8 )){
lines.onClose( () -> System.out.println("Done!") ).forEach( System.out::println );
}
}
}