Lambda 是一個匿名函數,只關注參數列表和方法體,咱們能夠把 Lambda表達式理解爲是一段能夠傳遞的代碼(將代碼像數據同樣進行傳遞)java
類型推斷:省略參數類型算法
內部類this關鍵字指向內部類自己,Lambda中this指向lambda所處在的類express
Java編譯器將lambda表達式編譯成類的私有方法。使用了Java 7的 invokedynamic 字節碼指令來動態綁定這個方法。數組
引入了->新操做符:參數表加操做體數據結構
(Parameters)->{expressions}複製代碼
類名 :: 方法名ide
使用@FunctionalInterface註解函數
接口中的抽象方法只能是一個(函數式接口)this
java.util.function.Predicate函數式接口,向API方法添加邏輯,很是適合作過濾器spa
List<String> names=Arrays.asList("dx","wdt","zfb","wuguangyao","nihaoshiw"));
Predicate<String> filter1 = str->str.length()>5;
Predicate<String> filter2 = str->str.endsWith("yao");
// filter(names,(n)->((String)n).startsWith("d"));
filter(names,filter2);
names.stream().filter(filter1.and(filter2))
.forEach(System.out::println);
}
public static void filter(List<String> list, Predicate condition){
for(String str:list){
if(condition.test(str)){
System.out.println(str);
}
}
}複製代碼
Runnable t = ()-> System.out.println("hello");
t.run();複製代碼
s線程
根接口
實體類實現Comparable接口
public class Student implements Comparable<Student> {
~~~~
@Override
public int compareTo(Student o) {
return stuId.compareTo(o.getStuId());
}複製代碼
建立一個比較器實現Comparator接口
Collections.sort(list, new Comparator<StudentNoSort>() {
@Override
public int compare(StudentNoSort o1, StudentNoSort o2) {
return o1.getStuId().compareTo(o2.getStuId());
}
});複製代碼
使用Jdk8 Stream更加簡單
List<StudentNoSort> streamList = list.stream()
.filter(w -> w.getClass()==StudentNoSort.class)
.sorted(((o1, o2) -> o1.getStuId().compareTo(o2.getStuId())))
.collect(Collectors.toList());複製代碼
Stream 不是集合元素,它不是數據結構並不保存數據,它是有關算法和計算的,它更像一個高級版本的 Iterator。原始版本的 Iterator,用戶只能顯式地一個一個遍歷元素並對其執行某些操做;高級版本的 Stream,用戶只要給出須要對其包含的元素執行什麼操做,好比 「過濾掉長度大於 10 的字符串」、「獲取每一個字符串的首字母」等,Stream 會隱式地在內部進行遍歷,作出相應的數據轉換。
獲取一個數據源(source)→ 數據轉換→執行操做(返回新的Stream對象),這就容許對其操做能夠像鏈條同樣排列,變成一個管道
集合,數組,I/O channel, 產生器generator 等
一個流能夠後面跟隨零個或多個 intermediate 操做。其目的主要是打開流,作出某種程度的數據映射/過濾,而後返回一個新的流,交給下一個操做使用。
建立一個List
過濾器:集合進行過濾操做
集合元素去重
對函數進行操做
組合元素
遍歷元素
限定流中數據的數量
排序 使用Comparator接口
符合元素傳入predicate,返回boolean
mapToInt (轉換爲int), summaryStatistics(int型變量統計) ,sum(int型求和)
一個流只能有一個 terminal 操做,當這個操做執行後,流就被使用「光」了,沒法再被操做。
Collections
Collections
List<String> list = Arrays.asList(strArray);
stream = list.stream();複製代碼
List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 12, 1, 1, 2, 3, 2, 432, 4, 32, 54, 3, 3));
int sum = list.stream().map(x -> x * x)
.reduce((x, y) -> x + y)
.get();複製代碼
Path start = FileSystems.getDefault().getPath("/home/dzou/報告/模電");
Files.walk(start)
.filter(path -> path.toFile().isFile())
.filter(path -> path.toString().endsWith(".jpg"))
.forEach(System.out::println);複製代碼
Stream 裏有個操做函數的集合,每次轉換操做就是把轉換函數放入這個集合中,在 Terminal 操做的時候循環 Stream 對應的集合,而後對每一個元素執行全部的函數
咱們看這個代碼,輸出不是順序的
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
numbers.parallelStream()
.forEach(out::println);複製代碼
底層使用ForkJoinPool,相比於ThreadPoolExecutor,可讓線程建立新的任務,並掛起當前任務,此時線程能夠在隊列中選擇子任務執行