1. 程式人生 > >java8新特性筆記

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