1. 程式人生 > >Java 8 API 流Stream

Java 8 API 流Stream

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 +
                '}';
    }
}