以下Employee为一个自定义的类 1
Lambda
类型推断
Lambda 表达式中无需指定类型,参数类型可由编译器通过上下文推断得出
函数式接口
只包含一个抽象方法的接口,称为函数式接口
- 四大内置接口
- 消费型Consumer < T >
//有参数,无返回值
void accept(T t);
- 供给型Supplier < T >
//无参数,有返回值
T get();
- 函数型Function < T, R >
//有参数,有返回值
R apply(T t);
- 断言型Predicate < T >
//有参数,返回值为boolean类型
boolean test(T t);
- 其他接口:参数和返回值数量与以上四种不同,原理大同小异。
方法、构造器、数组引用
方法引用
- 对象::实例方法
//一个典型Consumer的实现
Consumer<String> con = System.out::println;
con.accept("dsad");
Employee emp = new Employee();
Supplier<Integer> sup = emp::getAge;
System.out.println(sup.get());
- 类::静态方法
Comparator<Integer> com = Integer::compare;
System.out.println(com.compare(5,3));
- 类::实例方法
BiPredicate<String,String> bp = String::equals;
System.out.println(bp.test("hi","hi"));
构造器引用
Supplier<Employee> sup= Employee::new;
System.out.println(sup.get());
数组引用
Function<Integer,String[]> fun = String[]::new;
System.out.println(fun.apply(10).length);
Stream
- Stream自己不会存储元素
- Stream不会改变源对象。相反,会返回一个持有结果的新Stream
- Stream操作时延迟执行的。会等到需要结果的时候才执行。
tip:一个 Stream 只可以使用一次!否则会报错IllegalStateException: stream has already been operated upon or closed
Stream<Employee> sm = employees.stream();
sm.limit(5).distinct().forEach(System.out::println);
sm.map(Employee::getName).forEach(System.out::println);//第二次使用会报错
Stream的三个操作步骤
- 创建Stream
- 中间操作
- 终止操作
创建Stream
//1.通过Collection系列集合提供的的stream()或parallelStream()
List<String> list = new ArrayList<>();
Stream<String> sm1 = list.stream();
//2.通过Arrays类中的静态方法stream()
Employee[] employees = new Employee[10];
Stream<Employee> sm2 = Arrays.stream(employees);
//3.通过Stream类中的静态方法of()
Stream<String> sm3 = Stream.of("aa","bb","cc");
//4.无限流
//迭代
Stream<Integer> sm41 = Stream.iterate(0,(x)-> x+2);
//生成
Stream<Double> sm42 = Stream.generate(() -> Math.random());
中间操作
- 筛选与切片
filter(Predicate p)
distinct()
limit(long maxSize)
skip(long n) - 映射
map(Function f)【类比List的add()】
flatMap(Function f)【类比List的addAll()】 - 排序
sorted()【自然排序】
sorted(Comparator comp)【定制排序】
终止操作
- 查找与匹配
forEach(Consumer c)
allMatch(Predicate p)【返回boolean】
anyMatch(Predicate p)【返回boolean】
noneMatch(Predicate p)【返回boolean】
findFirst()【返回Optional< T >】
findAny()【返回Optional< T >】
max(Comparator c)【返回Optional< T >】
min(Comparator c)【返回Optional< T >】 - 归约与收集
reduce(T iden, BinaryOperator b) 【返回T】
reduce(BinaryOperator b)【返回Optional< T >】
collect(Collector c)
Employee为一个自定义的简单的类,用于实例演示。其包含三个属性:name,age,salary,以及相应的set/get方法, ↩︎