1. 為什麼有經驗的老手更傾向於使用Stream
效能優勢,(大數據量)相較於迭代器,速度更快
#支援串列與平行處理,並行處理更能充分利用CPU的資源
Stream 是計算資料的流,它本身不會儲存資料
支援函數式程式設計
#程式碼優雅,讓程式碼更有效率,乾淨,簡潔
#2. Stream 的使用方式
三步驟操作:
」建立
Stream
中間動作
# 終止操作
#3.Stream 的建立
##Stream
的建立都會依賴資料來源,通常是容器或陣列
流的建立大致分為4中,最常用的就是透過集合建立
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.IntStream; import java.util.stream.Stream; public class CreateStreamDemo { public static void main(String[] args) { // 1 通过集合创建Stream也是用的最多的一种形式 List<String> strList = new ArrayList<>(); strList.add("a"); strList.add("b"); strList.add("c"); // 创建串行操作流 Stream<String> stream = strList.stream(); // 创建并行操作流 Stream<String> parallelStream = strList.parallelStream(); // 2 通过数组创建Stream int[] arr = new int[]{1,2,3}; IntStream intStream = Arrays.stream(arr); // 3 通过Stream.of Stream<Integer> integerStream = Stream.of(1,2,3); Stream<String> stringStream = Stream.of("a","b","c"); // 4 无限流 // 每隔五个数取一个 Stream.iterate(0, t -> t + 5).forEach(System.out::println); // 迭代 Stream.generate(Math::random).forEach(System.out::println); // 生成 } }
4 . Stream 中間操作
中間操作,我們最為常用的就是過濾,去重,排序本章包含我們開發最常用的對物件的去重,和更據物件中的對個屬性組合排序import com.zhj.java8.bean.Student;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
import java.util.stream.Stream;
import static java.util.stream.Collectors.collectingAndThen;
import static java.util.stream.Collectors.toCollection;
public class MiddleStreamDemo {
public static void main(String[] args) {
List<Student> students = new ArrayList<>();
students.add(new Student(1,"小华",23,1));
students.add(new Student(1,"小华",23,2));
students.add(new Student(2,"小米",20,2));
students.add(new Student(3,"小果",30,3));
students.add(new Student(4,"小维",18,2));
// 过滤
students.stream().filter(stu -> stu.getAge() > 20).forEach(System.out::println);
// 去重
// 对对象去重是根据引用去重,内容重复并不会去重,除非重写equals和hashCode方法
System.out.println("----------去重----------");
System.out.println("去重1----------");
students.stream().distinct().forEach(System.out::println);
// 对集合中对象某些属性去重,不重写equals和hashCode方法,只能借助其他数据结构来辅助去重
// 单个属性可以stu -> stu.getId()
// 多个属性可以stu -> stu.getId() + ";" + stu.getName()
System.out.println("去重2----------");
ArrayList<Student> distinctList = students.stream().collect(
collectingAndThen(toCollection(() -> new TreeSet<>(Comparator.comparing(stu -> stu.getId() + ";" + stu.getName()))), ArrayList::new)
);
distinctList.stream().forEach(System.out::println);
// 排序 支持定义排序方式
// sorted 默认使用 自然序排序, 其中的元素必须实现Comparable 接口
System.out.println("----------排序----------");
System.out.println("排序1----------");
students.stream().sorted().forEach(System.out::println);
// sorted(Comparator<? super T> comparator) :我们可以使用lambada 来创建一个Comparator 实例。可以按照升序或着降序来排序元素。
System.out.println("排序2----------");
students.stream()
.sorted(Comparator.comparing(Student::getAge,Comparator.reverseOrder())) // ,Comparator.reverseOrder() 逆序
.forEach(System.out::println);
// 创建比较器,通过对比较器内容的定义实现对多个属性进行排序,类似sql中连续的orderBy
System.out.println("排序3----------");
students.stream().sorted(
(s1,s2) -> {
if (s1.getAge() == s2.getAge()) {
return s1.getSex().compareTo(s2.getSex());
} else {
return -s1.getAge().compareTo(s2.getAge());
}
}
).forEach(System.out::println);
System.out.println("排序4----------");
Comparator<Student> studentComparator = (s1,s2) -> {
Integer age1 = s1.getAge();
Integer age2 = s2.getAge();
if (age1 != age2) return age1 - age2;
Integer sex1 = s1.getSex();
Integer sex2 = s2.getSex();
if (sex1 != sex2) return sex2 - sex1;
return 0;
};
students.stream().sorted(studentComparator).forEach(System.out::println);
// 截取 截取前三个元素
System.out.println("----------截取----------");
students.stream().limit(3).forEach(System.out::println);
// 跳过 跳过前3个元素
System.out.println("----------跳过----------");
students.stream().skip(3).forEach(System.out::println);
// 映射
System.out.println("----------映射----------");
System.out.println("映射Map----------");
// map接收Lambda,将元素转换其他形式,或者是提取信息,并将其映射成一个新的元素
Stream<Stream<Student>> streamStream1 = students.stream().map(str -> filterStudent(str));
streamStream1.forEach(sm -> sm.forEach(System.out::println));
System.out.println("映射flatMap----------");
// map接收Lambda,将流中的每一个元素转换成另一个流,然后把所有流连成一个流 扁平化映射
Stream<Student> studentStream2 = students.stream().flatMap(str -> filterStudent(str));
studentStream2.forEach(System.out::println);
// 消费
System.out.println("----------消费----------");
students.stream().peek(stu -> stu.setAge(100)).forEach(System.out::println);
}
public static Stream<Student> filterStudent(Student student) {
student = new Student();
return Stream.of(student);
}
}
public class Student implements Comparable<Student> { private Integer id; private String name; private Integer age; private Integer sex; public Student() { } public Student(Integer id, String name, Integer age, Integer sex) { this.id = id; this.name = name; this.age = age; this.sex = sex; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Integer getSex() { return sex; } public void setSex(Integer sex) { this.sex = sex; } @Override public String toString() { return "Student{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", age='" + age + '\'' + ", sex=" + sex + '}'; } @Override public int compareTo(Student o) { return this.getAge() - o.getAge(); } }
5. Stream 終止運算
的終止運算,最常用的就是講處理過的資料收集到新的容器中,同時可以實現向Sql聚合函數,分組的一些效果
package com.zhj.java8.stream; import com.zhj.java8.bean.Student; import java.util.*; import java.util.stream.Collectors; public class TerminationStreamDemo { public static void main(String[] args) { List<Student> students = new ArrayList<>(); students.add(new Student(1,"小华",23,1)); students.add(new Student(2,"小米",20,2)); students.add(new Student(3,"小果",30,3)); students.add(new Student(4,"小维",18,2)); students.add(new Student(5,"小华",23,2)); System.out.println("--------------------匹配聚合操作--------------------"); // allMatch:接收一个 Predicate 函数,当流中每个元素都符合该断言时才返回true,否则返回false boolean allMatch = students.stream().allMatch(stu -> stu.getAge() > 10); System.out.println("全部符合大于10岁条件:" + allMatch); // noneMatch:接收一个 Predicate 函数,当流中每个元素都不符合该断言时才返回true,否则返回false boolean noneMatch = students.stream().noneMatch(stu -> stu.getAge() > 10); System.out.println("全部不符合大于10岁条件:" + noneMatch); // anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足该断言则返回true,否则返回false boolean anyMatch = students.stream().anyMatch(stu -> stu.getAge() > 20); System.out.println("含有任意符合大于20岁条件:" + anyMatch); // findFirst:返回流中第一个元素 Student findFirst = students.stream().findFirst().get(); System.out.println("第一个学生:" + findFirst); // findAny:返回流中的任意元素 Student findAny = students.stream().findAny().get(); System.out.println("任意一个学生:" + findAny); // count:返回流中元素的总个数 long count = students.stream().count(); System.out.println("学生总数:" + count); // max:返回流中元素最大值 Student max = students.stream().max(Student::compareTo).get(); System.out.println("年龄最大学生:" + max); // max:返回流中元素最大值 Student min = students.stream().min(Student::compareTo).get(); System.out.println("年龄最小学生:" + min); System.out.println("--------------------规约操作--------------------"); System.out.println("学生年龄总和:" + students.stream().map(Student::getAge).reduce(Integer::sum)); System.out.println("学生年龄最大:" + students.stream().map(Student::getAge).reduce(Integer::max)); System.out.println("--------------------收集操作--------------------"); List<Student> list = students.stream().collect(Collectors.toList()); Set<Student> set = students.stream().collect(Collectors.toSet()); Map<Integer, String> map = students.stream().collect(Collectors.toMap(Student::getId, Student::getName)); String joinName = students.stream().map(Student::getName).collect(Collectors.joining(",", "(", ")")); // 总数 students.stream().collect(Collectors.counting()); // 最大年龄 students.stream().map(Student::getAge).collect(Collectors.maxBy(Integer::compare)).get(); // 年龄和 students.stream().collect(Collectors.summingInt(Student::getAge)); // 平均年龄 students.stream().collect(Collectors.averagingDouble(Student::getAge)); // 信息合集 DoubleSummaryStatistics statistics = students.stream().collect(Collectors.summarizingDouble(Student::getAge)); System.out.println("count:" + statistics.getCount() + ",max:" + statistics.getMax() + ",sum:" + statistics.getSum() + ",average:" + statistics.getAverage()); // 分组 Map<Integer, List<Student>> collect = students.stream().collect(Collectors.groupingBy(Student::getSex)); System.out.println(collect); //多重分组,先根据性别分再根据年龄分 Map<Integer, Map<Integer, List<Student>>> typeAgeMap = list.stream().collect(Collectors.groupingBy(Student::getSex, Collectors.groupingBy(Student::getAge))); //分区 //分成两部分,一部分大于20岁,一部分小于等于20岁 Map<Boolean, List<Student>> partMap = list.stream().collect(Collectors.partitioningBy(v -> v.getAge() > 20)); //规约 Integer allAge = list.stream().map(Student::getAge).collect(Collectors.reducing(Integer::sum)).get(); System.out.println(allAge); } }
6. Stream 特性
中間運算惰性執行多個中間操作的話,不會多次循環,
多個轉換操作只會在終止操作的時候融合起來,一次循環完成- 。
- 內部迭代
- 找到符合條件的資料後邊的迭代不會進行
- #流的末端操作只有一次
異常:
意思是流已經被關閉了,這是因為當我們使用末端操作之後,
流就被關閉了,無法再次被調用###,如果我們想重複調用,只能重新打開一個新的流。 ###以上是Java8中Stream的使用方式是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

SublimeText3漢化版
中文版,非常好用

Dreamweaver Mac版
視覺化網頁開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載
最受歡迎的的開源編輯器