Supplier
1,
@FunctionalInterface
public interface Supplier<T> {
2, T get();
3,
Supplier<Apple> c1 = Apple::new
Apple a1 = c1.get();
consumer接口
1,
@FunctionalInterface
public interface Consumer<T> {
2,void accept(T t);
3,主要用来输出的
function 接口
1,public interface Function<T, R> {
2,T apply(F input);
3,主要是用来转换东西的
4,函数复合,
- andThen f.andThen(g) 数学上会写作g(f(x))
- compose f.compose(g); 数学上会写作f(g(x))
Predicate接口
1,充当一个参数化的返回Boolean比较方法
2,public interface Predicate<T> {
3,boolean test(T t);
4,能动态替换返回boolean的函数
5,基本类型装箱问题,
DoublePredicate
boolean test(double value);//有对应的原始类型特化接口
6,谓词复合,优先级从左到右a.or(b).and(c) == (a || b )&& c
- negate()
- and()
- or()
lambda用法
1,
2,
3,
4,基本lambda语法
5,基本用法
6,在面向资源编程的lambda,不需要重复打开资源和关闭资源
7,lambda也有匿名函数的问题
8,方法引用
- 静态方法引用,(例如Integer的parseInt方法,写作Integer::parseInt)。
- 实例方法引用,(例如String的length,String::length
- 方法体里面的方法引用,进一步的方法引用
9,比较器复合
- 翻转:list.sort(comparing(Object::getXXX).reveserd());
- 同样的时候添加第二个比较器,第二个是comparator类型, list.sort(Comparator.comparing(Integer::intValue).reversed().thenComparing(Integer::compareTo));
stream
1,更加简单的利用多cpu
2,基本概念
- flatMap
6,查找和匹配
- anyMatch方法返回一个boolean,因此是一个终端操作。
- allMatch方法的工作原理和anyMatch类似,但它会看看流中的元素是否都能匹配给定的谓
- 和allMatch相对的是noneMatch。
.noneMatch(d -> d.getCalories() >= 1000);
- findFirst和findAny
7,归约
- reduce ,累加:int sum = numbers.stream().reduce(0, Integer::sum);
最大最小值:Optional min = numbers.stream().reduce(Integer::min);
8,并发的有状态和无状态
9,优化自动装箱,
- int calories = menu.stream() .mapToInt(Dish::getCalories) .sum();
- 自动装箱
IntStream intStream = menu.stream().mapToInt(Dish::getCalories)
Stream<Integer> stream = intStream.boxed();
10,小结
11,collect
Java8其他
1,default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
可以添加默认实现
2,在 java8 中的接口中不仅增加了默认方法,还增加了静态方法。使用方式接口名.方法名。
3,
@FunctionalInterface
public interface Runnable {表明是个函数接口
Java8重构小实例
1,策略模式,类似predicate替换策略
2,模板方法,
3,观察者模式,注册的时候写上方法
4,责任链模式,在注册的时候像观察者模式差不多
5,传统简单工厂,用map和supplier