首頁 > Java > java教程 > 主體

Java平行流

WBOY
發布: 2024-08-30 16:11:08
原創
620 人瀏覽過

並行流是物件的平行流,它支援各種可以產生預期輸出的函數。並行流不是一種允許使用者從集合、陣列、Java 輸入和輸出 API 中輸入輸入的資料結構。並行流不會改變功能的實際行為,但它可以根據應用的過濾器(管道)提供輸出。平行流是 Java 函數式程式設計的一部分,在 Java 8th 版本之後出現。並行流是 Lambda 表達式的一個額外優勢。

廣告 該類別中的熱門課程 JAVA 掌握 - 專業化 | 78 課程系列 | 15 次模擬測驗

開始您的免費軟體開發課程

網頁開發、程式語言、軟體測試及其他

Java 並行流的方法

  • parallelStream() 方法
  • parallel() 方法

並行流在 Java 中如何運作?

它是基於集合上應用的parallelStream()方法或流上的parallel()方法。

文法:

List<Object> list=new ArrayList<Object>();
list.parallelStream();
登入後複製

說明:

  • 首先,我們建立一個陣列列表集合。
  • 在陣列集合上應用了 paralleStream() 方法。
  • 我們得出結論,parallelStream() 僅適用於集合。

文法:

IntStream inStream=IntStream.rangeClosed(initialValue, finalValue);
inStream.parallel();
登入後複製

說明:

  • 首先,我們建立一個 IntStream 流。
  • 在流上應用了parallel()方法。
  • 我們得出結論,parallel() 僅適用於流。

範例

以下是範例:

範例#1

parallelStream() 應用於大寫字母。

代碼:

import java.util.ArrayList;
import java.util.List;
public class ParalleStreamOnAlphabets {
public static void main(String[] args) {
System.out.println("Capital Alphabets before Parallel Stream");
// creating array list for adding alphabets
List<String> capitalAlphabets = new ArrayList<>();
int ascilCode = 65; // Ascii value of A=65 and Z=90
while (ascilCode <= 90) { // iterating ascii values
char alphabets = (char) ascilCode; // converting integer to character
capitalAlphabets.add(String.valueOf(alphabets)); // adding Capital alphabets to list
ascilCode++;// pre increment operator
}
// displaying initial Alphabets
capitalAlphabets.stream().forEach(System.out::println);
System.out.println("Capital Alphabets after Parallel Stream");
// inserting all elements to another list to apply parallelStream
// operation without modifying previous array list
List<String> captatlAlphabetsParalleStream = capitalAlphabets;
//applying parallelStream() on new array list
captatlAlphabetsParalleStream.parallelStream().forEach(System.out::println);
}
}
登入後複製

輸出:

Java平行流

Java平行流

說明:

  • 正如您在應用並行流之前看到的輸出一樣,我們按順序獲得了輸出。
  • 但是當我們應用並行流時,我們得到了輸出 zig-zag 方式意味著並行。

範例#2

parallelStream() 應用於偶數。

代碼:

import java.util.ArrayList;
import java.util.List;
public class ParallelStreamEvenNumbers {
public static void main(String[] args) {
System.out.println("Even Numbers before Parallel Stream");
// creating array list for adding alphabets
List<Integer> evenNumbers = new ArrayList<Integer>();
for (int number=0;number<=10;number++) { // iterating numbers
if(number%2==0) //if number even go inside the condition
evenNumbers.add(number); //added all even numbers
}
// displaying initial even numbers
evenNumbers.stream().forEach(System.out::println);
System.out.println("Even Numbers before Parallel Stream");
// inserting all elements to another list to apply parallelStream
// operation without modifying previous array list
List<Integer> captatlAlphabetsParalleStream = evenNumbers;
// applying parallelStream() on new array list
captatlAlphabetsParalleStream.parallelStream().forEach(System.out::println);
}
}
登入後複製

輸出:

Java平行流

說明:

  • 正如您在應用並行流之前看到的輸出一樣,我們按順序獲得了輸出。
  • 但是當我們應用並行流時,我們得到了輸出 zig-zag 方式意味著並行。

範例#3

parallelStream() 應用於課程費用。

代碼:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Stream;
public class ParallelStreamCourseFee {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("How many number would you like to enter=>");
int inputNumber = scanner.nextInt(); // asking user for number count
List<Courses> courseWithFee = new ArrayList<Courses>();// creating array
String coursename = "";
int courseFee = 0;
for (int i = 0; i < inputNumber; i++) {
coursename = scanner.next();//taking course name input
courseFee = scanner.nextInt();//taking course fee input
courseWithFee.add(new Courses(coursename, courseFee));//adding course name and fee
}
//get the stream list which courses fee is >1000
Stream<Courses> list = courseWithFee.parallelStream().filter(e -> e.getCourseFee() > 1000);
//displaying courses count which is fee is >1000
System.out.println("Course Fee above 1000 is=> " + list.count());
scanner.close();
}
}
//courses class
class Courses {
String course;
int courseFee;
public Courses(String course, int courseFee) {
this.course = course;
this.courseFee = courseFee;
}
public String getCourse() {
return course;
}
public void setCourse(String course) {
this.course = course;
}
public int getCourseFee() {
return courseFee;
}
public void setCourseFee(int courseFee) {
this.courseFee = courseFee;
}
}
登入後複製

輸出:

Java平行流

說明:

  • 正如您在輸出中看到的,我們必須計算課程費用 >1000。

範例#4

parallel() 應用於奇數計數。

代碼:

import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
// Taking InStream with range of 1 to 1000
//On rane() applied parallel method
//On parallel() method applied filter to decide whether given number odd or not
//after getting odd numbers we simply displaying odd numnbers count
int oddNumberCount = (int) IntStream.range(1, 1000).parallel().filter(value -> oddOrNot(value)).count();
//displaying odd number count
System.out.println("Count of Odd Number from 1-1000 range is => " + oddNumberCount);
}
public static boolean oddOrNot(int inputNumber) {
//checking first number >0 and then checking range from 1 tom 1000
//next checking odd number or not within nonMatch method
return inputNumber > 0
&& IntStream.rangeClosed(1, inputNumber).noneMatch(temp -> inputNumber % 2 == 0);
}
}
登入後複製

輸出:

Java平行流

說明:

  • 如您所見,並行方法只能應用於流。

範例#5

parallel() 應用於質數。

代碼:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.function.IntPredicate;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class ParallelPrimeNumber {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("How many number would you like to enter=>");
int inputNumber = scanner.nextInt(); //asking user for number count
System.out.print("Enter your numbers =>");
List<Integer> listNumbers = new ArrayList<Integer>();//creating array list
for (int i = 0; i < inputNumber; i++) {
listNumbers.add(scanner.nextInt());//adding user elements into an array
}
//checking the entered numbers are prime or not
//filter(ParallelCount::isPrime) ParallelCount is class name and primeNumberOrNot method
List<Integer> primeOut = listNumbers.stream().filter(ParallelPrimeNumber::primeNumberOrNot).collect(Collectors.toList());
System.out.print("Prime number set from your entered numbers is/are=>");
for (Integer i : primeOut) {
System.out.print(i+" ");//displaying prime numbers
}
scanner.close();
}
public static boolean primeNumberOrNot(int i) {
//IntPredicate checks the number whether even, odd, prime etc. based on condition
IntPredicate trueOrNot = index -> i % index == 0;
//return true if entered number is prime else returns false
return i > 1 && IntStream.range(2, i).noneMatch(trueOrNot);
}
}
登入後複製

輸出:

Java平行流

說明:

  • 如你在上面的程式碼中看到的,即使是流上的平行方法也執行素數、偶數、奇數等邏輯。

Java並行流的優點與應用

以下是優點和應用:

優點

  • 比普通過濾器更有效地提高 CPU 使用率。
  • 並行流一次處理多個資料。

應用

  • 與聚合功能一起使用。
  • 與更大尺寸的集合框架一起使用。
  • 與順序流一起使用。

結論

它是透過集合上的parallelStream()方法和流上的parallel()方法來實現的。並行流減少了處理時間,因此主要使用大集合資料。

以上是Java平行流的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!