java1.8的新特性
阿新 • • 發佈:2020-09-11
一、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));