一、接口定义增强
旧:接口中只能定义最终变量和抽象方法
接口可以定义:1、默认方法 2、静态方法
二、Lamda表达式(函数式接口)
旧:匿名内部类(可以实现多个抽象方法)
1、(参数) -> 单行语句;
2、(参数) -> {多行语句};
3、(参数) -> 表达式;
示例如下:
interface Pr {
public int add(int a,int b);
}
main方法{
fun((a,b) -> a + b); //调用
}
public static void fun(Pr pr) {
System.out.print(pr.add(1,2)); //3
}
三、方法引用(函数式接口)
使用java8下java.util.function提供的四种通用函数式接口(推荐)
1)功能Function<T,R> R apply(T t)
2)消费Consumer<T> void accept(T t)
3)供给Supplier<T> T get()
4)断言Predicate<T> boolean test(T t)
BiFunction<T,U,R> R apply(T t,U u)
可以自定义函数式接口(不推荐)
定义要求:接口中只能有一个抽象方法;接口名上需要添加@FunctionInfterface注解
1、类 :: 静态方法
2、对象 :: 普通方法
3、类 :: new
4、特定类 :: 普通方法
Function<String,String> fun = String :: toUpperCase;
String result = fun.apply(“abc”); //ABC
四、流式编程(Stream)
BaseStream
子类:Stream<T> 、DoubleSteam(下面有个统计方法summaryStatistics())、IntStream、LongStream
Java8集合
Collection接口提供了默认方法
default Stream stream()获取数据流(可以理解加工厂)
default forEach(Consumer con);
Stream接口提供了很多处理集合数据的方法:
Stream map(Function fun); 逐个处理集合内数据
Stream filter(Predicate pre); 过滤
Stream skip(long n); 设置跳过的数据行数
Stream limit(long maxSize); 设置取出的数据个数
boolean allMatch(Predicate pre); 全匹配
boolean anyMatch(Predicate pre); 匹配任意一个
Option reduce(BiFunction bf)
Predicate函数式接口提供了默认方法:可以实现多个条件匹配
default Predicate or(Predicate pre);
default Predicate and(Predicate pre);
List<String> list = new ArrayList<String>();
list.add(“Java”);
list.add(“Java”);
list.add(“Android”);
List<String> newList = list.stream().distinct.map((x) -> x.toLowerCase()).filter((x) -> x.contains(“a”)).collect(Collectors.toList());
newList.forEach(System.out::println);
数据统计示例:
方式一:简单MapReduce处理分析数据示例:
double s = all.stream().map((x) -> x.getAmount() * x.getPrice()).reduce((sum,s) -> sum + s).get();
方式二:使用DoubleStream流
DoubleSummaryStatistics dss = all.stream.mapToDouble((x) -> x.getAmount() * x.getPrice()).summaryStatistics();
dss.getAverage()
dss.getCount();
dss.getMax();
dss.getSum();