day13【Stream流、方法引用】

主要內容

  • Stream流
  • 方法引用

1 Stream流

JDK1.8+出現,關注做什麼,而不是怎麼做

1.1 流程式思想

  • 對一組數據進行多過濾,篩選,統計…
  • Stream流並不會存儲元素,流對象只能被消費一次
  • 只能內部迭代遍歷
  • Stream流是一個來自數據源的元素隊列並支持聚合操作
  • 數據源:可以是集合或數組等等.

1.2 獲取流

Collection集合都可以通過stream默認方法獲取流
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();

Stream接口靜態方法of可以獲取數組對應的流
String[] array = { "張無忌", "張翠山", "張三丰", "張一元" };
Stream<String> stream = Stream.of(array);

of方法的參數是一個可變參數,所以支持數組

1.3 常用方法

  • 延遲方法:返回值類型仍然是Stream自身,支持鏈式調用
過濾:fiter
Stream<T> filter(Predicate<? super T> predicate)

映射(轉換):map
<R> Stream<R> map(Function<? super T, ? extends R> mapper);

取用前幾個:limit
Stream<T> limit(long maxSize);

跳過前幾個:skip
Stream<T> skip(long n);

組合:concat
static <T> Stream<T> concat(Stream<? extends T> a,Stream<? extends T> b)
  • 終結方法:返回值不再是Stream,不支持鏈式,相當於流水線的開關。
遍歷:forEach
void forEach(Consumer<? super T> action)

統計個數:count
long count();
  • 擴展
將元素存儲到數組
String[] str = Stream.of().toArray(String[]::new)

將元素存儲到集合
List<T> list = Stream.of().collect(Collectors.toList());

2 方法引用

  • 如果Lambda表達式僅僅是調用一個已經存在的方法, 那就可以通過方法引用來替代Lambda表達式
    作用::簡化Lambda表達式
    :: :方法引用運算符, 它所在的表達式被稱爲方法引用
  • Lambda表達式寫法:
    (String s) -> System.out.println(s)
    參數傳遞給System.out.println()方法去打印
  • 方法引用寫法:
    System.out::println
    用System.out.println()方法中代碼, 來作爲Lambda中重寫方法的實現方式

注意:
Lambda中傳遞的參數一定是方法引用中的那個方法可以接收的類型,否則會拋出異常

方法引用能簡化以下場景: (方法名後不要寫小括號)
  1. 通過對象名引用成員方法
    對象名::成員方法名
    System.out::println
  2. 通過類名引用靜態方法
    類名::靜態方法名
    i -> Math.abs(i)
    Math::abs
  3. 通過super引用父類成員方法
    super::父類方法名
    ()->super.eat();
    super::eat
  4. 通過this引用本類成員方法
    this::本類方法名
    ()->this.eat();
    this::eat
  5. 引用某個類的構造方法
    類名::new
    name->new Person(name)
    Person::new
  6. 引用創建數組的方法
    數據類型[]::new
    length->new int[length];
    int[]::new
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章