Java 流操作

2023-06-16 13:28 更新

Java流 - Java流操作

外部迭代

當使用Java集合時,我們使用外部迭代。

在外部迭代中,我們?yōu)槊總€循環(huán)使用for或,或者為序列中的集合的集合和過程元素獲取迭代器。

以下代碼計算列表中所有奇整數(shù)的平方和。

它使用每個循環(huán)訪問列表中的每一個元素,然后使用if語句來過濾奇整數(shù)。

之后,它計算平方,最后存儲平方和與和變量。

import java.util.Arrays;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    int sum = 0;
    for (int n : numbers) {
      if (n % 2 == 1) {
        int square = n * n;
        sum = sum + square;
      }
    }
    System.out.println(sum);
  }
}

上面的代碼生成以下結(jié)果。


內(nèi)部迭代

我們可以使用stream重寫上面的代碼。 它做的完全一樣。

import java.util.Arrays;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    int sum = numbers.stream()
        .filter(n -> n % 2  == 1)
        .map(n  -> n * n)
        .reduce(0, Integer::sum);

    System.out.println(sum);
  }
}

在上面的代碼中,我們沒有使用循環(huán)語句來遍歷List。 我們通過流在內(nèi)部執(zhí)行循環(huán)。

對于奇整數(shù)計算,我們使用lambda表達式。 我們首先做了過濾,然后映射然后減少。

上面的代碼生成以下結(jié)果。


順序

外部迭代通常意味著順序代碼。順序代碼只能由一個線程執(zhí)行。

流被設計為并行處理元素。

以下代碼并行計算列表中奇整數(shù)的平方和。

import java.util.Arrays;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    int sum = numbers.parallelStream()
        .filter(n -> n % 2  == 1)
        .map(n  -> n * n)
        .reduce(0, Integer::sum);

    System.out.println(sum);
  }
}

我們做的只是用parallelStream()替換stream()。

使用流提供的內(nèi)部迭代時,并行計算很容易。

上面的代碼生成以下結(jié)果。

命令式與功能式

在命令式編程中,我們不僅控制要做什么,還要如何做。

例如,當使用命令性編程來對列表中的整數(shù)求和時。 我們必須決定如何迭代列表中的每個元素。 我們可以使用for循環(huán),for-each循環(huán),或者我們可以從list中獲取一個Iterator對象,并使用while循環(huán)。 然后我們也要做總和。

在聲明性編程中,我們只需要告訴該做什么,該部分如何由系統(tǒng)本身處理。

集合支持命令式編程,而流支持聲明式編程。

Streams API通過使用lambda表達式支持函數(shù)式編程。

我們要對流元素執(zhí)行的操作通常通過傳遞lambda表達式完成。

流上的操作產(chǎn)生結(jié)果而不修改數(shù)據(jù)源。

中間業(yè)務終端業(yè)務

流支持兩種類型的操作:

  • 中間操作
  • 終端操作

中間操作也稱為惰性操作。

終端操作也稱為急切操作。

惰性操作不處理元素,直到在流上調(diào)用熱切操作。

流上的中間操作產(chǎn)生另一流。

Streams鏈接操作以創(chuàng)建流管道。

在下面的代碼中filter()和map()都是惰性操作。 而reduce()是急切的操作。

import java.util.Arrays;
import java.util.List;

public class Main {
  public static void main(String[] args) {
    List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
    int sum = numbers.parallelStream()
        .filter(n -> n % 2  == 1)
        .map(n  -> n * n)
        .reduce(0, Integer::sum);

    System.out.println(sum);
  }
}

上面的代碼生成以下結(jié)果。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號