Stream的出现是为了让java支持函数式编程,从而使得写出的代码更加的紧凑可读。
public class MyStream {
//stream的中间处理函数和终极处理函数
//stream的中间处理函数会继续返回stream
//stream的终极处理函数会处理集合里面的数据,返回最终的结果
@Test
public void test1() {
final Collection<Task> tasks = generateTasks();
int sumCount = tasks.stream()
.filter(task -> task.getStatus() == Status.OPEN) //中间函数
.mapToInt(Task::getPoints) //中间函数
.sum(); //终极函数
System.out.println(sumCount);
}
private Collection<Task> generateTasks() {
final Collection<Task> tasks = Arrays.asList(
new Task(Status.OPEN, 5),
new Task( Status.OPEN, 8 ),
new Task( Status.CLOSED, 10 )
);
return tasks;
}
//stream 并行处理
//类似于MapReduce变成模型,多个map并行处理,最终由reduce做聚合处理
@Test
public void test2() {
final Collection<Task> tasks = generateTasks();
int sumNum = tasks
.stream()
.parallel()
.map(task -> task.getPoints())
.reduce(0, Integer::sum);
System.out.println(sumNum);
}
//集合元素分组1
@Test
public void test3() {
final Collection<Task> tasks = generateTasks();
final Map< Status, List< Task > > map = tasks
.stream()
.collect(Collectors.groupingBy(Task::getStatus));
System.out.println(map);
}
//集合元素分组2
@Test
public void test4() {
final Collection<Task> tasks = generateTasks();
int countValue = 23;
final Collection< String > result = tasks
.stream()
.mapToInt(Task::getPoints)
.asLongStream()
.mapToDouble(points -> (double)points / countValue)
.boxed()
.mapToLong(weight -> (long) (weight * 100))
.mapToObj( percent -> String.valueOf(percent) + "%")
.collect(Collectors.toList());
System.out.println(result);
}
// 响应式变成,处理文件读取行
@Test
public void test5() {
String filename = "xx";
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 );
} catch (Exception ex) {
System.out.println(ex);
}
}
private enum Status {
CLOSED, OPEN
}
private static final 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);
}
}
}