package com.song.demo.java8;
import java.util.Arrays;
import java.util.IntSummaryStatistics;
import java.util.List;
import java.util.stream.Collectors;
/**
* Java8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据
* Stram API 可以提高Java程序员的生产力
* 这种风格将要处理的元素集合数据看做是一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合
*
*
* +--------------------+ +------+ +------+ +---+ +-------+
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
+--------------------+ +------+ +------+ +---+ +-------+
* 生成流对象
* 在 Java 8 中, 集合接口有两个方法来生成流:
* . stream() - 为集合创建串行流
* . parallelStream() - 为集合创建并行流。
*
*
*/
public class Stream {
public static void main(String[] args) {
List<String> names = Arrays.asList("abc", "", "bc", "efg", "abcd", "jkl");
// list
names.forEach(name -> System.out.println(name + ">>"));
// map 方法用于映射每个元素到对应的结果
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
List<Integer> collect = numbers.stream().map(num -> num * num).distinct().collect(Collectors.toList());
System.out.println(collect);
// filter
List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
long count = strings.stream().filter(str -> str.isEmpty()).count();
System.out.println(count);
// sorted
numbers.stream().sorted().limit(4).forEach(System.out::print);
System.out.println();
// 并行 (parallel)程序
long result = strings.parallelStream().limit(3).filter(str -> str.equalsIgnoreCase("abc")).count();
System.out.println(result);
// Collectors 例如将流转换成集合和聚合元素。Collectors 可用于返回列表或字符串:
String array = strings.stream().filter(str -> str.length() > 2).collect(Collectors.joining(","));
System.out.println(array);
// 统计
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());
}
}