1. 程式人生 > 實用技巧 >java1.8的新特性

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還是一個函式式介面?

 3、Lmabda表示式的語法總結: () -> ();

  答:如果一個介面中宣告的抽象方法是重寫了超類Object類中任意一個public方法,那麼這些抽象方法並不會算入介面的抽象方法數量中。因為任何介面的實現都會從其父類Object或其它地方獲得這些方法的實現。

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