Java 流操作

2023-06-16 13:28 更新

Java流 - Java流操作

外部迭代

當(dāng)使用Java集合時(shí),我們使用外部迭代。

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

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

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

之后,它計(jì)算平方,最后存儲(chǔ)平方和與和變量。

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重寫(xiě)上面的代碼。 它做的完全一樣。

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);
  }
}

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

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

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


順序

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

流被設(shè)計(jì)為并行處理元素。

以下代碼并行計(jì)算列表中奇整數(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)部迭代時(shí),并行計(jì)算很容易。

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

命令式與功能式

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

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

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

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

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

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

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

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

流支持兩種類(lèi)型的操作:

  • 中間操作
  • 終端操作

中間操作也稱(chēng)為惰性操作。

終端操作也稱(chēng)為急切操作。

惰性操作不處理元素,直到在流上調(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)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)