Java 8 API 流Stream
阿新 • • 發佈:2018-11-01
Stream 使用一種類似用 SQL 語句從資料庫查詢資料的直觀方式來提供一種對 Java 集合運算和表達的高階抽象。
Stream API可以極大提高Java程式設計師的生產力,讓程式設計師寫出高效率、乾淨、簡潔的程式碼。
這種風格將要處理的元素集合看作一種流, 流在管道中傳輸, 並且可以在管道的節點上進行處理, 比如篩選, 排序,聚合等。
元素流在管道中經過中間操作(intermediate operation)的處理,最後由最終操作(terminal operation)得到前面處理的結果。
什麼是 Stream?
Stream(流)是一個來自資料來源的元素佇列並支援聚合操作
元素是特定型別的物件,形成一個佇列。 Java中的Stream並不會儲存元素,而是按需計算。
資料來源 流的來源。 可以是集合,陣列,I/O channel, 產生器generator 等。
聚合操作 類似SQL語句一樣的操作, 比如filter, map, reduce, find, match, sorted等。
和以前的Collection操作不同, Stream操作還有兩個基礎的特徵:
Pipelining: 中間操作都會返回流物件本身。 這樣多個操作可以串聯成一個管道, 如同流式風格(fluent style)。 這樣做可以對操作進行優化, 比如延遲執行(laziness)和短路( short-circuiting)。
內部迭代: 以前對集合遍歷都是通過Iterator或者For-Each的方式, 顯式的在集合外部進行迭代, 這叫做外部迭代。 Stream提供了內部迭代的方式, 通過訪問者模式(Visitor)實現。
下面是應用例子:
import java.awt.*; import java.lang.reflect.Array; import java.util.*; import java.util.List; import java.util.stream.Collectors; public class Test003 { public static void main(String[] args) { List<Person> listPerson = Arrays.asList(new Person(10, "tomo"), new Person(29, "jerry") , new Person(25, "katty")); System.out.println("-----------1.過濾年齡是10的人的資訊,顯示其他人資訊--------------"); List<Person> resultlist = listPerson.stream().filter(person -> 10 != person.getAge()).collect(Collectors.toList()); resultlist.forEach(person -> { System.out.println(person.getName()); System.out.println(person.getAge()); }); System.out.println("-----------2.拼接集合中人的姓名--------------"); String splitename = listPerson.stream().map(Person :: getName).collect(Collectors.joining(",")); System.out.println(splitename); splitename = listPerson.stream().map(Person :: getName).collect(Collectors.joining()); System.out.println(splitename); splitename = listPerson.stream().map(Person :: getName).collect(Collectors.joining("," ,"[", "]")); System.out.println(splitename); System.out.println("-----------3.查詢年齡是21歲的人的姓名【有就顯示姓名 否則輸出null】--------------"); String name = listPerson.stream().filter(person -> 21 == person.getAge()).map(Person :: getName).findAny().orElse(null); System.out.println(name); System.out.println("-----------4.查詢年齡是29歲的人的姓名--------------"); name = listPerson.stream().filter(person -> 29 == person.getAge()).map(Person :: getName).findAny().orElse(null); System.out.println("-----------5.查詢年齡最大的人的姓名--------------"); listPerson.stream().collect(Collectors.maxBy(Comparator.comparingInt(Person :: getAge))).map(Person :: getName).ifPresent(System.out::println); System.out.println("-----------6.查詢年齡最大的人資訊--------------"); Optional<Person> result2 = listPerson.stream().collect(Collectors.minBy(Comparator.comparing(Person :: getAge))) ; if (result2.isPresent()) { Person person = result2.get(); System.out.println(person.getAge()); System.out.println(person.getName()); } System.out.println("----------根據年齡排序【正序】---------------"); List<Person> list = listPerson.stream().sorted((x,y) -> x.getAge() - y.getAge()).collect(Collectors.toList()); list.forEach(person -> System.out.println(person.getAge())); System.out.println("-------------------------"); } } class Person { private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Person(int age , String name) { this.name = name; this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }