网站开发 APP开发 小程序开发 SEO优化 公司新闻

java8新特性之lambda表达式

2018-05-24 00:00:00
963

  ·一.lambda表达式语法

  语法一:无参数,无返回值

  ()->System.out.println("你在哪");

  语法二:有一个参数,无返回值

  (x)->System.out.println(x);

  语法三:若有一个参数,无返回值 可以不写小括号

  x->System.out.println(x);

  语法四:有两个或多个参数,有返回值,lambda体中有多条数据

  Comparator<Integer> co = (x,y)->{

  System.out.println("语法四");

  return Integer.compare(x,y);

  };

  语法五:若lambda体中只有一条语句,return 和大括号可以不写

  (x,y)->Integer.compare(x, y);

  语法六:lambda表达式中的参数类型可以不写,编译器会根据上下文推断

  ·二.lambda表达式需要函数式接口的支持

  函数式接口:接口中只有一个抽象方法的接口称为函数式接口。@FunctionalInterface可以使用判断是否是函数式接口

  ·三.Java8内置的四大核心函数式接口

  Consumer<T>:消费型接口

  void accept(T t)

  Supplier(T):供给型接口

  T get();

  Function<T,R>:函数型接口

  R apply(T t);

  Predicate<T>:断言型接口

  boolen test(T t)
  ·四:·4.1方法引用

  主要有三种语法格式

  1.对象::实例方法名

  PrintStream ps1 = System.out;

  2.类::静态方法名

  Comparator<Integer> com = (x,y)->Integer.compare(x,y);

  Comparator<Integer> cm = Integer::compare;

  3.类::实例方法名

  BiPredicate <String,String> bp = (x,y)->x.equals(y);

  BiPredicate <String,String> bp1 = String::equals;

  注意:

  1.lambda 体中调用方法的参数列表与返回值类型,要与函数式接口中的抽象方法的函数列表和返回值类型保持一致

  2.若lambda 参数列表中的第一参数时实例方法的调用者,而第二个参数时实例方法的参数时,可以使用ClassName::method

  ·4.2构造器引用

  格式:ClassName::new

  注意:需要调用的构造器参数列表要与函数式接口中的抽象方法的参数列表保持一致

  ·4.3数组引用

  格式:Type[]::new

  例如:

  Function<Integer,String[]>fun = (x)->new String[x];

  String[] str = fun.apply(10);

  System.out.println(str.length);

  Function<Integer,String[]>fun = String[]::new;

  String[] str = fun.apply(20);

  System.out.println(str.length);

  ·五:Stream的三个操作步骤:

  1.创建Stream

  1.1通过Collection系列集合提供的stream()或parallelStream()

  List<String> list = new ArrayList<>();

  Stream<String> stream1 = list.Stream();

  1.2通过Arrays中的静态方法stream()获取数组流

  Employee[] emps = new Employee[10];

  Stream<Employee> stream2 = Arrays.stream(emps);

  1.3通过Stream类中的静态方法of()

  Stream<String> stream3 = String.of("aa","bb","cc");

  1.4创建无限流

  迭代

  Stream<Integer> stream4 = Stream.iterate(0,(x)->x+2);

  stream4.forEach(System.out::println);//无限生成

  //生成

  Stream.generate(()->Math.ramdom());

  2.中间操作

  2.1 筛选与切片

  filter -- 接收lambda,从流中排除某些元素。

  limit -- 截断流,使其元素不超过给定数量

  skip(n)-- 跳过元素,返回一个扔掉了前n个元素的流,若流中元素不足n个,则返回一个空流,与limit(n)互补

  distinct- 筛选,通过流所生成元素的hashCode()和equals去除重复元素

  2.2 映射

  map -- 接收lambda,有元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每一个元素上,并将其映射成一个新元素。

  3.终止操作。