import com.sun.xml.internal.bind.v2.schemagen.xmlschema.Union;
import java.util.*;
import java.util.stream.Collectors;
/**
* JAVA 8 lambda表达式
*/
public class Test {
public static void main(String[] args) {
String[] array = {"Rafael Nadal", "Novak Djokovic",
"Stanislas Wawrinka",
"David Ferrer","Roger Federer",
"Andy Murray","Tomas Berdych",
"Juan Martin Del Potro"};
List<Person> programmers = new ArrayList<Person>() {
{
//Person实体类略,姓名,职业,性别,年龄,薪资
add(new Person("Elsdon", "Java programmer", "male", 43, 2000));
add(new Person("Tamsen", "Java programmer", "female", 23, 1500));
add(new Person("Floyd", "Java programmer", "male", 33, 1800));
add(new Person("Sindy", "Java programmer", "female", 32, 1600));
add(new Person("Vere", "Java programmer", "male", 22, 1200));
add(new Person("Maude", "Java programmer", "female", 27, 1900));
add(new Person("Shawn", "Java programmer", "male", 30, 2300));
add(new Person("Jayden","Java programmer", "female", 35, 1700));
add(new Person("Palmer", "Java programmer", "male", 33, 2000));
add(new Person("Addison", "Java programmer", "female", 34, 1450));
}
};
List<String> strings = Arrays.asList(array);
//strings.forEach(a-> System.out.println(a+","));
//
//new Thread(()-> System.out.println(Thread.currentThread().getName()+"|hello")).start();
//遍历
System.out.println("所有程序员的姓名:");
programmers.forEach(name-> System.out.println(name.getName()));
//遍历
System.out.println("给程序员加薪 5% :");
//Consumer<Person> giveRaise = e->e.setSalary(e.getSalary()/100*5+e.getSalary());
//programmers.forEach(giveRaise);
programmers.forEach(e->e.setSalary(e.getSalary()+e.getSalary()/100*5));
//过滤filter
System.out.println("下面是月薪超过$1,400 的程序员:");
programmers.stream().filter(e->e.getSalary()>1400).forEach(a-> System.out.println(a.getName()));
//排序sorted
System.out.println("薪资由高到低:");
//自然排序
System.out.println(programmers.stream().map(e->e.getSalary()).sorted().collect(Collectors.toList()));
//用比较器实现倒序
System.out.println(programmers.stream().map(e->e.getSalary()).sorted(Comparator.reverseOrder()).collect(Collectors.toList()));
//limit+skip=subString!!!!!!!!
//限制结果集limit
System.out.println("限制结果集前6个:");
programmers.stream().limit(6).forEach(e-> System.out.println(e.toString()));
//skip忽略前n个
System.out.println(Stream.of("a","b","c").skip(1).collect(Collectors.toList()));
//去重distinct
System.out.println(Stream.of("a","a","b","c","c").distinct().collect(Collectors.toList()));
//最高(大)max
System.out.println("薪资最高:");
System.out.println(programmers.stream().max((a,b)->(a.getSalary()-b.getSalary())));
//最低(小)min
System.out.println("薪资最低:");
System.out.println(programmers.stream().min((a,b)->(a.getSalary()-b.getSalary())));
//collect返回集合(聚合)
System.out.println("collect返回集合:");
List<Person> list = programmers.stream().limit(9).collect(Collectors.toList());
System.out.println(list.toString());
//count计数
System.out.println("count计数:"+programmers.stream().count());
//map把集合中的每一个元素映射成另一个元素
System.out.println("map:");
programmers.stream().map(e->e.getName().toUpperCase()).forEach(e-> System.out.println(e));
//flatMap把集合中的每一个元素映射成一个集合,扁平化的map
List<String> list2 = Arrays.asList(array);
List<String> collect = list2.stream().flatMap(a -> Arrays.stream(a.split(" "))).collect(Collectors.toList());
System.out.println(collect.toString());
//reduce将集合中所有值结合规约
System.out.println(programmers.stream().map(e->e.getSalary()).reduce((a,b)->a+b).get());
//使用summaryStatistics方法获得stream 中元素的各种汇总数据
// 接下来我们可以访问这些方法,比如getMax, getMin, getSum或getAverage.
List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
IntSummaryStatistics statistics = primes.stream().mapToInt(x -> x).summaryStatistics();
System.out.println(statistics.getAverage());
System.out.println(statistics.getSum());
}
}
System.out::println 可以看作 e -> System.out.println(e) 的缩写
map和flatMap的区别:
1. map会将每一条输入映射为一个新对象:
{苹果,梨子}.map(去皮) = {去皮苹果,去皮梨子}, 其中:“去皮”函数的类型为:A => B
2.flatMap包含两个操作:会将每一个输入对象输入映射为一个新集合,然后把这些新集合连成一个大集合:
{苹果,梨子}.flatMap(切碎) = {苹果碎片1,苹果碎片2,梨子碎片1,梨子碎片2} ,其中: “切碎”函数的类型为: A => List<B>