java1.8 新特性 - 引用形式

1方法引用

三种表现形式:

1. 对象::实例方法名

2. 类::静态方法名

3. 类::实例方法名 (lambda参数列表中第一个参数是实例方法的调用 者,第二个参数是实例方法的参数时可用)

public void test() {

        /**

        *注意:

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

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

        *

        */

        Consumer<Integer> con = (x) -> System.out.println(x);

        con.accept(100);

 

        // 方法引用-对象::实例方法

        Consumer<Integer> con2 = System.out::println;

        con2.accept(200);

 

        // 方法引用-类名::静态方法名

        BiFunction<Integer, Integer, Integer> biFun = (x, y) -> Integer.compare(x, y);

        BiFunction<Integer, Integer, Integer> biFun2 = Integer::compare;

        Integer result = biFun2.apply(100, 200);

 

        // 方法引用-类名::实例方法名

        BiFunction<String, String, Boolean> fun1 = (str1, str2) -> str1.equals(str2);

        BiFunction<String, String, Boolean> fun2 = String::equals;

        Boolean result2 = fun2.apply("hello", "world");

        System.out.println(result2);

    }

2构造器引用 


格式:ClassName::new

public void test2() {

 

        // 构造方法引用  类名::new

        Supplier<Employee> sup = () -> new Employee();

        System.out.println(sup.get());

        Supplier<Employee> sup2 = Employee::new;

        System.out.println(sup2.get());

 

        // 构造方法引用 类名::new (带一个参数)

        Function<Integer, Employee> fun = (x) -> new Employee(x);

        Function<Integer, Employee> fun2 = Employee::new;

        System.out.println(fun2.apply(100));

 }

3数组引用

格式:Type[]::new

public void test(){

        // 数组引用

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

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

        String[] strArray = fun2.apply(10);

        Arrays.stream(strArray).forEach(System.out::println);

}

 

Stream API

Stream操作的三个步骤

 

创建stream

中间操作(过滤、map)

终止操作

stream的创建:

 

    // 1,校验通过Collection 系列集合提供的stream()或者paralleStream()

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

    Strean<String> stream1 = list.stream();

 

    // 2.通过Arrays的静态方法stream()获取数组流

    String[] str = new String[10];

    Stream<String> stream2 = Arrays.stream(str);

 

    // 3.通过Stream类中的静态方法of

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

 

    // 4.创建无限流

    // 迭代

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

 

    //生成

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

 

 

Stream的中间操作:

 

/**

   * 筛选 过滤  去重

   */

  emps.stream()

          .filter(e -> e.getAge() > 10)

          .limit(4)

          .skip(4)

          // 需要流中的元素重写hashCode和equals方法

          .distinct()

          .forEach(System.out::println);

 

 

  /**

   *  生成新的流 通过map映射

   */

  emps.stream()

          .map((e) -> e.getAge())

          .forEach(System.out::println);

  /**

   *  自然排序  定制排序

   */

  emps.stream()

          .sorted((e1 ,e2) -> {

              if (e1.getAge().equals(e2.getAge())){

                  return e1.getName().compareTo(e2.getName());

              } else{

                  return e1.getAge().compareTo(e2.getAge());

              }

          })

          .forEach(System.out::println);

Stream的终止操作:

 

 /**

         *      查找和匹配

         *          allMatch-检查是否匹配所有元素

         *          anyMatch-检查是否至少匹配一个元素

         *          noneMatch-检查是否没有匹配所有元素

         *          findFirst-返回第一个元素

         *          findAny-返回当前流中的任意元素

         *          count-返回流中元素的总个数

         *          max-返回流中最大值

         *          min-返回流中最小值

         */

 

        /**

         *  检查是否匹配元素

         */

        boolean b1 = emps.stream()

                .allMatch((e) -> e.getStatus().equals(Employee.Status.BUSY));

        System.out.println(b1);

 

        boolean b2 = emps.stream()

                .anyMatch((e) -> e.getStatus().equals(Employee.Status.BUSY));

        System.out.println(b2);

 

        boolean b3 = emps.stream()

                .noneMatch((e) -> e.getStatus().equals(Employee.Status.BUSY));

        System.out.println(b3);

 

        Optional<Employee> opt = emps.stream()

                .findFirst();

        System.out.println(opt.get());

 

        // 并行流

        Optional<Employee> opt2 = emps.parallelStream()

                .findAny();

        System.out.println(opt2.get());

 

        long count = emps.stream()

                .count();

        System.out.println(count);

 

        Optional<Employee> max = emps.stream()

                .max((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()));

        System.out.println(max.get());

 

        Optional<Employee> min = emps.stream()

                .min((e1, e2) -> Double.compare(e1.getSalary(), e2.getSalary()));

        System.out.println(min.get());

 

 

还有功能比较强大的两个终止操作 reduce和collect

reduce操作: reduce:(T identity,BinaryOperator)/reduce(BinaryOperator)-可以将流中元素反复结合起来,得到一个值

 

         /**

         *  reduce :规约操作

         */

        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);

        Integer count2 = list.stream()

                .reduce(0, (x, y) -> x + y);

        System.out.println(count2);

 

        Optional<Double> sum = emps.stream()

                .map(Employee::getSalary)

                .reduce(Double::sum);

        System.out.println(sum);

collect操作:Collect-将流转换为其他形式,接收一个Collection接口的实现,用于给Stream中元素做汇总的方法

        /**

         *  collect:收集操作

         */

        List<Integer> ageList = emps.stream()

                .map(Employee::getAge)

                .collect(Collectors.toList());

        ageList.stream().forEach(System.out::println);

猜你喜欢

转载自blog.csdn.net/zzqcsdn123/article/details/85199584