java8新特性筆記
1、排序
List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");
names.sort((a, b) -> a.compareTo(b));
將names列表按首字母排序。
2、流式程式設計
java.util.Stream
表示可以在其上執行一個或多個操作的元素序列。流操作是中間操作或終端操作。當終端操作返回某種型別的結果時,中間操作會返回流本身,因此您可以連續連結多個方法呼叫。流是在源上建立的,例如java.util.Collection
類似的列表或集(不支援對映)。流操作可以順序執行,也可以並行執行。
List<String> stringCollection = new ArrayList<>(); stringCollection.add("ddd2"); stringCollection.add("aaa2"); stringCollection.add("bbb1"); stringCollection.add("aaa1"); stringCollection.add("bbb3"); stringCollection.add("ccc"); stringCollection.add("bbb2"); stringCollection.add("ddd1");
過濾(filter)
過濾器接受謂詞以過濾流的所有元素。此操作是中間操作,相當於對元素進行篩選。ForEach接受為過濾流中的每個元素執行的使用者。ForEach是一個終端操作。
stringCollection .stream() .filter((s) -> s.startsWith("a")) .forEach(System.out::println);
排序(sorted)
Sorted是一個中間操作,它返回流的排序檢視。除非您傳遞自定義,否則元素按自然順序排序Comparator
。
stringCollection .stream() .sorted() .filter((s) -> s.startsWith("a")) .forEach(System.out::println);
請記住,sorted
它只會建立流的排序檢視,而不會操縱已備份集合的順序。順序stringCollection
是不受影響的:
轉化(map)
中間操作map
的每個元素轉換成經由給定功能的另一個物件。以下示例將每個字串轉換為大寫字串。但您也可以使用map
將每個物件轉換為另一種型別。結果流的泛型型別取決於傳遞給函式的泛型型別。
stringCollection .stream() .map(String::toUpperCase) .sorted((a, b) -> b.compareTo(a)) .forEach(System.out::println);
匹配(match)
可以使用各種匹配操作來檢查某個變數是否與流匹配。所有這些操作都是終端並返回一個布林結果。
boolean anyStartsWithA = stringCollection .stream() .anyMatch((s) -> s.startsWith("a")); System.out.println(anyStartsWithA); // true boolean allStartsWithA = stringCollection .stream() .allMatch((s) -> s.startsWith("a")); System.out.println(allStartsWithA); // false boolean noneStartsWithZ = stringCollection .stream() .noneMatch((s) -> s.startsWith("z")); System.out.println(noneStartsWithZ); // true
計數(count)
Count是一個終端操作,它將流中的元素數作為a返回long
。
long startsWithB = stringCollection .stream() .filter((s) -> s.startsWith("b")) .count(); System.out.println(startsWithB); // 3
操作(reduce)
reduce可以執行各類操作。
stream = Arrays.stream(new Integer[]{1, 2, 3, 4, 5, 6, 7});
//求和
stream.reduce((i, j) -> i + j).ifPresent(System.out::println);
//求最大值
stream.reduce(Integer::max).ifPresent(System.out::println);
//求最小值
stream.reduce(Integer::min).ifPresent(System.out::println);
//做邏輯
stream.reduce((i, j) -> i > j ? j : i).ifPresent(System.out::println);
Parallel Streams(並行流)
如上所述,流可以是順序的或並行的。對順序流的操作在單個執行緒上執行,而並行流上的操作在多個執行緒上同時執行。
以下示例演示了使用並行流來提高效能的難易程度。
現在我們測量對此集合的流進行排序所需的時間。
順序排序
long t0 = System.nanoTime(); long count = values.stream().sorted().count(); System.out.println(count); long t1 = System.nanoTime(); long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0); System.out.println(String.format("sequential sort took: %d ms", millis)); // sequential sort took: 899 ms
並行排序
long t0 = System.nanoTime(); long count = values.parallelStream().sorted().count(); System.out.println(count); long t1 = System.nanoTime(); long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0); System.out.println(String.format("parallel sort took: %d ms", millis)); // parallel sort took: 472 ms
正如您所看到的,兩個程式碼片段幾乎完全相同,但並行排序大約快了50%。你所要做的就是換stream()
到parallelStream()
。