最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中Stream?API的使用示例詳解

 更新時(shí)間:2023年11月22日 14:00:55   作者:架構(gòu)成長(zhǎng)指南  
Java?在?Java?8?中提供了一個(gè)新的附加包,稱為?java.util.stream,該包由類、接口和枚舉組成,允許對(duì)元素進(jìn)行函數(shù)式操作,?本文主要介紹了Java中Stream?API的具體使用,感興趣的小伙伴可以了解下

Java 在 Java 8 中提供了一個(gè)新的附加包,稱為 java.util.stream。該包由類、接口和枚舉組成,允許對(duì)元素進(jìn)行函數(shù)式操作。 您可以通過(guò)在程序中導(dǎo)入 java.util.stream包來(lái)使用流。

Stream提供以下功能

Stream不存儲(chǔ)元素。它只是通過(guò)計(jì)算操作的管道傳送來(lái)自數(shù)據(jù)結(jié)構(gòu)、數(shù)組或 I/O 通道等源的元素。

Stream本質(zhì)上是函數(shù)式的,對(duì)流執(zhí)行的操作不會(huì)修改其源。例如,過(guò)濾從集合獲取的 Stream 會(huì)生成一個(gè)沒(méi)有過(guò)濾元素的新 Stream,而不是從源集合中刪除元素。

Stream是惰性的,僅在需要時(shí)才計(jì)算代碼,在流的生命周期中,流的元素僅被訪問(wèn)一次。

與迭代器一樣,必須生成新流才能重新訪問(wèn)源中的相同元素。

您可以使用 Stream 來(lái) 過(guò)濾、收集、打印以及 從一種數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為其他數(shù)據(jù)結(jié)構(gòu)等。

Stream API 示例

1. 創(chuàng)建一個(gè)空的Stream

在創(chuàng)建空流時(shí),應(yīng)使用 empty() 方法:

Stream<String> stream = Stream.empty();
stream.forEach(System.out::println);

通常情況下,在創(chuàng)建時(shí)會(huì)使用 empty() 方法,以避免在沒(méi)有元素的流中返回 null:

public Stream<String> streamOf(List<String> list) {
    return list == null || list.isEmpty() ? Stream.empty() : list.stream();
}

2.從集合中創(chuàng)建流

import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Stream;

public class StreamCreationExamples {
    public static void main(String[] args) throws IOException {

        Collection<String> collection = Arrays.asList("JAVA", "J2EE", "Spring", "Hibernate");
        Stream<String> stream2 = collection.stream();
        stream2.forEach(System.out::println);

        List<String> list = Arrays.asList("JAVA", "J2EE", "Spring", "Hibernate");
        Stream<String> stream3 = list.stream();
        stream3.forEach(System.out::println);

        Set<String> set = new HashSet<>(list);
        Stream<String> stream4 = set.stream();
        stream4.forEach(System.out::println);
    }
}

輸出

JAVA
J2EE
Spring
Hibernate
JAVA
J2EE
Spring
Hibernate
JAVA
Hibernate
J2EE
Spring

3. 從數(shù)組中創(chuàng)建流對(duì)象

數(shù)組可以是流的源,也可以從現(xiàn)有數(shù)組或數(shù)組的一部分創(chuàng)建數(shù)組:

import java.util.Arrays;
import java.util.stream.Stream;

public class StreamCreationExample {
    public static void main(String[] args) {
        // 使用Arrays.stream()創(chuàng)建流
        int[] numbers = {1, 2, 3, 4, 5};
        Stream<Integer> stream1 = Arrays.stream(numbers);
        System.out.println("Using Arrays.stream():");
        stream1.forEach(System.out::println);

        // 使用Stream.of()創(chuàng)建流
        String[] names = {"Alice", "Bob", "Charlie"};
        Stream<String> stream2 = Stream.of(names);
        System.out.println("Using Stream.of():");
        stream2.forEach(System.out::println);

        // 使用Stream.builder()創(chuàng)建流
        String[] colors = {"Red", "Green", "Blue"};
        Stream.Builder<String> builder = Stream.builder();
        for (String color : colors) {
            builder.add(color);
        }
        Stream<String> stream3 = builder.build();
        System.out.println("Using Stream.builder():");
        stream3.forEach(System.out::println);
    }
}

輸出

Using Arrays.stream():
1
2
3
4
5
Using Stream.of():
Alice
Bob
Charlie
Using Stream.builder():
Red
Green
Blue

4. 使用Stream過(guò)濾一個(gè)集合示例

在下面的示例中,我們不使用流過(guò)濾數(shù)據(jù),看看代碼是什么樣的,同時(shí)我們?cè)诮o出一個(gè)使用stream過(guò)濾的示例,對(duì)比一下

不使用Stream過(guò)濾一個(gè)集合示例

import java.util.ArrayList;
import java.util.List;

public class FilterWithoutStreamExample {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(10);
        numbers.add(20);
        numbers.add(30);
        numbers.add(40);
        numbers.add(50);

        List<Integer> filteredNumbers = new ArrayList<>();
        for (Integer number : numbers) {
            if (number > 30) {
                filteredNumbers.add(number);
            }
        }

        System.out.println("Filtered numbers (without Stream):");
        for (Integer number : filteredNumbers) {
            System.out.println(number);
        }
    }
}

輸出:

Filtered numbers (without Stream):
40
50

使用 Stream 過(guò)濾集合示例:

import java.util.ArrayList;
import java.util.List;

public class FilterWithStreamExample {
    public static void main(String[] args) {
        List<Integer> numbers = new ArrayList<>();
        numbers.add(10);
        numbers.add(20);
        numbers.add(30);
        numbers.add(40);
        numbers.add(50);

        List<Integer> filteredNumbers = numbers.stream()
                .filter(number -> number > 30)
                .toList();

        System.out.println("Filtered numbers (with Stream):");
        filteredNumbers.forEach(System.out::println);
    }
}

輸出:

Filtered numbers (with Stream):
40
50

前后我們對(duì)比一下,可以看到,使用 Stream 進(jìn)行集合過(guò)濾可以更加簡(jiǎn)潔和直觀,減少了手動(dòng)迭代和添加元素的步驟。它提供了一種聲明式的編程風(fēng)格,使代碼更易讀、可維護(hù)和可擴(kuò)展。

5. 使用Stream過(guò)濾和遍歷集合

在下面的示例中,我們使用 filter() 方法進(jìn)行過(guò)濾,使用 forEach() 方法對(duì)數(shù)據(jù)流進(jìn)行迭代:

import java.util.ArrayList;
import java.util.List;

public class FilterAndIterateWithStreamExample {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add("Alice");
        names.add("Bob");
        names.add("Charlie");
        names.add("David");
        names.add("Eve");

        System.out.println("Filtered names starting with 'A':");
        names.stream()
                .filter(name -> name.startsWith("A"))
                .forEach(System.out::println);
    }
}

輸出

Filtered names starting with 'A':
Alice

在上述示例中,我們有一個(gè)字符串列表 names,其中包含了一些名字。
我們使用 Stream 進(jìn)行過(guò)濾和迭代操作以查找以字母 "A" 開頭的名字。

6.使用Collectors方法求和

我們還可以使用Collectors計(jì)算數(shù)值之和。

在下面的示例中,我們使用Collectors類及其指定方法計(jì)算所有產(chǎn)品價(jià)格的總和。

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class SumByUsingCollectorsMethods {
    public static void main(String[] args) {
        List < Product > productsList = new ArrayList < Product > ();
        productsList.add(new Product(1, "HP Laptop", 25000f));
        productsList.add(new Product(2, "Dell Laptop", 30000f));
        productsList.add(new Product(3, "Lenevo Laptop", 28000f));
        productsList.add(new Product(4, "Sony Laptop", 28000f));
        productsList.add(new Product(5, "Apple Laptop", 90000f));
        
        double totalPrice3 = productsList.stream()
            .collect(Collectors.summingDouble(product -> product.getPrice()));
        System.out.println(totalPrice3);

    }
}

輸出

201000.0

7. 使用Stream查找年齡最大和最小的學(xué)生

假設(shè)有一個(gè) Student 類具有 name 和 age 屬性。我們可以使用 Stream 來(lái)查找學(xué)生集合中年齡的最大和最小值,并打印出相應(yīng)的學(xué)生信息。以下是一個(gè)示例:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;

public class StudentStreamExample {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("Alice", 20));
        students.add(new Student("Bob", 22));
        students.add(new Student("Charlie", 19));
        students.add(new Student("David", 21));

        // 查找年齡最大的學(xué)生
        Optional<Student> maxAgeStudent = students.stream()
                .max(Comparator.comparingInt(Student::getAge));

        // 查找年齡最小的學(xué)生
        Optional<Student> minAgeStudent = students.stream()
                .min(Comparator.comparingInt(Student::getAge));

        // 打印最大和最小年齡的學(xué)生信息
        System.out.println("Student with maximum age:");
        maxAgeStudent.ifPresent(System.out::println);

        System.out.println("Student with minimum age:");
        minAgeStudent.ifPresent(System.out::println);
    }
}

class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

輸出:

Student with maximum age:
Student{name='Bob', age=22}
Student with minimum age:
Student{name='Charlie', age=19}

8. 使用Stream轉(zhuǎn)換List為Map

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class StudentStreamToMapExample {
    public static void main(String[] args) {
        List<Student> students = new ArrayList<>();
        students.add(new Student("Alice", 20));
        students.add(new Student("Bob", 22));
        students.add(new Student("Charlie", 19));
        students.add(new Student("David", 21));

        // 將學(xué)生列表轉(zhuǎn)換為 Map,以姓名為鍵,學(xué)生對(duì)象為值
        Map<String, Student> studentMap = students.stream()
                .collect(Collectors.toMap(Student::getName, student -> student));

        // 打印學(xué)生 Map
        for (Map.Entry<String, Student> entry : studentMap.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
    }
}

class Student {
    private String name;
    private int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

輸出

David: Student{name='David', age=21}
Bob: Student{name='Bob', age=22}
Charlie: Student{name='Charlie', age=19}
Alice: Student{name='Alice', age=20}

在上面示例中,我們使用Collectors.toMap() 方法將學(xué)生列表轉(zhuǎn)換為 Map。我們指定了鍵提取器 Student::getName,將學(xué)生的姓名作為鍵。對(duì)于值提取器,我們使用了一個(gè)匿名函數(shù) student -> student,它返回學(xué)生對(duì)象本身作為值。

9. 使用Stream把List對(duì)象轉(zhuǎn)換為另一個(gè)List對(duì)象

假設(shè)我們有一個(gè) Person 類,其中包含姓名和年齡屬性。我們可以使用 Stream 來(lái)將一個(gè) List 對(duì)象轉(zhuǎn)換為另一個(gè) List 對(duì)象,其中只包含人員的姓名。以下是一個(gè)示例:

  import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class ListTransformationExample {
    public static void main(String[] args) {
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("Alice", 20));
        persons.add(new Person("Bob", 22));
        persons.add(new Person("Charlie", 19));

        // 將 Person 列表轉(zhuǎn)換為只包含姓名的 String 列表
        List<String> names = persons.stream()
                .map(Person::getName)
                .collect(Collectors.toList());

        // 打印轉(zhuǎn)換后的姓名列表
        System.out.println(names);
    }
}

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

輸出:

  [Alice, Bob, Charlie]

在上述示例中,我們有一個(gè) Person 類,其中包含姓名和年齡屬性。我們創(chuàng)建了一個(gè) persons 列表,并添加了幾個(gè) Person 對(duì)象。

使用Stream,我們通過(guò)調(diào)用 map() 方法并傳入一個(gè)方法引用 Person::getName,最后,我們使用 collect()方法和 Collectors.toList() 將轉(zhuǎn)換后的姓名收集到一個(gè)新的列表中。

API

https://docs.oracle.com/javase/8/docs/api/java/util/stream/package-summary.html

以上就是Java中Stream API的使用示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Java Stream API的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot2.x 參數(shù)校驗(yàn)問(wèn)題小結(jié)

    SpringBoot2.x 參數(shù)校驗(yàn)問(wèn)題小結(jié)

    這篇文章主要介紹了SpringBoot2.x 參數(shù)校驗(yàn)一些問(wèn)題總結(jié),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-08-08
  • Java二叉樹中LCA問(wèn)題解決方法兩則

    Java二叉樹中LCA問(wèn)題解決方法兩則

    這篇文章主要介紹了Java二叉樹中LCA問(wèn)題解決方法,總的來(lái)說(shuō)這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過(guò)程。希望通過(guò)這道題能給你帶來(lái)一種解題優(yōu)化的思路
    2022-12-12
  • IntelliJ?IDEA?2021.3?正式發(fā)布之支持遠(yuǎn)程開發(fā)、IDE故障排查等多項(xiàng)優(yōu)化改進(jìn)

    IntelliJ?IDEA?2021.3?正式發(fā)布之支持遠(yuǎn)程開發(fā)、IDE故障排查等多項(xiàng)優(yōu)化改進(jìn)

    IntelliJ?IDEA?2021.3?正式發(fā)布:支持遠(yuǎn)程開發(fā)、IDE故障排查等多項(xiàng)優(yōu)化改進(jìn)問(wèn)題,在這個(gè)版本中的遠(yuǎn)程開發(fā)還不是一個(gè)正式版本,而是BETA版,但通過(guò)這個(gè)BETA版本,也可以體驗(yàn)IDEA“遠(yuǎn)程開發(fā)”給我們帶來(lái)的全新體驗(yàn)
    2021-12-12
  • 使用Filter實(shí)現(xiàn)登錄權(quán)限驗(yàn)證

    使用Filter實(shí)現(xiàn)登錄權(quán)限驗(yàn)證

    這篇文章主要為大家詳細(xì)介紹了使用Filter實(shí)現(xiàn)登錄權(quán)限驗(yàn)證,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • Java線程創(chuàng)建(賣票),線程同步(賣包子)的實(shí)現(xiàn)示例

    Java線程創(chuàng)建(賣票),線程同步(賣包子)的實(shí)現(xiàn)示例

    這篇文章主要介紹了Java線程創(chuàng)建(賣票),線程同步(賣包子)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • 面試官:java ThreadLocal真的會(huì)造成內(nèi)存泄露嗎

    面試官:java ThreadLocal真的會(huì)造成內(nèi)存泄露嗎

    ThreadLocal,java面試過(guò)程中的“釘子戶”,在網(wǎng)上也充斥著各種有關(guān)ThreadLocal內(nèi)存泄露的問(wèn)題,本文換個(gè)角度,先思考ThreadLocal體系中的ThreadLocalMap為什么要設(shè)計(jì)成弱引用
    2021-08-08
  • JAVA 注解Annotation開發(fā)流程從原理到實(shí)戰(zhàn)應(yīng)用

    JAVA 注解Annotation開發(fā)流程從原理到實(shí)戰(zhàn)應(yīng)用

    本文詳細(xì)介紹了Java注解(Annotation)的核心概念、分類及在開發(fā)中的應(yīng)用價(jià)值,重點(diǎn)講解了注解在AOP、ORM、權(quán)限校驗(yàn)和單元測(cè)試等高級(jí)應(yīng)用場(chǎng)景中的使用方法,并提供了注解的最佳實(shí)踐建議和一個(gè)基于注解的權(quán)限校驗(yàn)框架的實(shí)戰(zhàn)案例
    2026-04-04
  • Spring中的接口重試機(jī)制spring-retry之listeners參數(shù)解析

    Spring中的接口重試機(jī)制spring-retry之listeners參數(shù)解析

    這篇文章主要介紹了Spring中的接口重試機(jī)制spring-retry之listeners參數(shù)解析,注解@Retryable有一個(gè)參數(shù)listeners沒(méi)有說(shuō)明,那么本篇文章我們?cè)敿?xì)介紹一個(gè)這個(gè)參數(shù)的用,需要的朋友可以參考下
    2024-01-01
  • Springboot實(shí)現(xiàn)根據(jù)條件切換注入不同實(shí)現(xiàn)類的示例代碼

    Springboot實(shí)現(xiàn)根據(jù)條件切換注入不同實(shí)現(xiàn)類的示例代碼

    這篇文章主要介紹了Springboot實(shí)現(xiàn)根據(jù)條件切換注入不同實(shí)現(xiàn)類的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • java常見(jiàn)的序列化方式

    java常見(jiàn)的序列化方式

    這篇文章主要為大家詳細(xì)介紹了java中兩種常見(jiàn)的序列化方式,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評(píng)論

瑞安市| 观塘区| 军事| 霍林郭勒市| 阿城市| 广东省| 长泰县| 南京市| 迭部县| 红桥区| 永靖县| 昌邑市| 巴林右旗| 乡宁县| 深州市| 洱源县| 甘洛县| 遂川县| 临夏县| 冕宁县| 阿荣旗| 临武县| 青阳县| 仁寿县| 巴马| 平湖市| 永川市| 卢湾区| 湟中县| 隆尧县| 阿城市| 兖州市| 贡山| 桓仁| 忻州市| 海安县| 抚顺县| 东乡县| 瑞金市| 栖霞市| 孝昌县|