java1.8的新特性

一、lambda表达式与函数式接口

(1)lambda表达式:lambda表达式本质上是一段匿名内部类即接口使用匿名方式创建对象,也可以是一段可以传递的代码

  //匿名内部类
  Comparator<Integer> cpt = new Comparator<Integer>() {
      @Override
      public int compare(Integer o1, Integer o2) {
          return Integer.compare(o1,o2);
      }
  };
  TreeSet<Integer> set = new TreeSet<>(cpt);

  //使用lambda表达式
  Comparator<Integer> cpt1 = (x,y) -> Integer.compare(x,y);
  Comparator<Integer> cpt2 = (x,y) -> {
      x=x-y;
      return x-y;
  };
  TreeSet<Integer> set2 = new TreeSet<>(cpt2);

 1、当一个接口中存在多个抽象方法时,如果使用lambda表达式,并不能智能匹配对应的抽象方法,因此引入了函数式接口的概念

 2、为什么Comparator接口有两个抽象方法compare和equals,Comparator还是一个函数式接口?

  答:如果一个接口中声明的抽象方法是重写了超类Object类中任意一个public方法,那么这些抽象方法并不会算入接口的抽象方法数量中。因为任何接口的实现都会从其父类Object或其它地方获得这些方法的实现。

 3、Lmabda表达式的语法总结: () -> ();

      

(2)函数式接口

  1、有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。函数式接口可以被隐式转换为 lambda 表达式。

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

二、StreamAPI

  Stream专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。

(1)Stream操作的三个步骤:创建,中间操作(过滤,map等),终止

  1、Stream的创建

//通过Collection 系列集合提供的stream()或者paralleStream()
    List<String> list = new ArrayList<>();
    Strean<String> stream1 = list.stream();

//通过Arrays的静态方法stream()获取数组流
Stream<String> stream2 = Arrays.stream(new String[10]);

//通过Stream类中的静态方法of
Stream<String> stream3 = Stream.of("aa","bb","cc");

//创建无限流
Stream<Integer> stream4 = Stream.iterate(0,(x) -> x+2);
Stream.generate(() ->Math.random());

  2、Stream的中间操作:

// 筛选 过滤  去重
emps.stream()
          .filter(e -> e.getAge() > 10)
          .limit(4)
          .skip(4)
          // 需要流中的元素重写hashCode和equals方法
          .distinct()
          .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);

  3、Stream的终止操作:

/*
count-返回流中元素的总个数
max-返回流中最大值
min-返回流中最小值
*/
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());

  4、reduce和collect操作

//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);

//collect
List<Integer> ageList = emps.stream()
                .map(Employee::getAge)
                .collect(Collectors.toList());
ageList.stream().forEach(System.out::println);

List<Integer> intList = new ArrayList<>();
intList.stream().map(s->String.valueOf(s)).collect(Collectors.toList()) .forEach(s-> System.out.println(s));

 

 

 

  

posted on 2020-09-11 10:37  hdc520  阅读(318)  评论(0编辑  收藏  举报

导航