How to use Stream in Java8
1. Why experienced veterans prefer to use Stream
Performance advantages, (large data volume) compared to iterators, it is faster
Supports serial and parallel processing, Parallel processing can make full use of CPU resources
Stream is a stream of calculation data. It does not store data itself
Supports functional programming
The code is elegant, making the code more efficient, clean and concise
2. How to use Stream
Three steps:
Create
StreamIntermediate operation
Termination operation
3. Creation of Stream
# The creation of ##Stream will depend on the data source, usually a container or an array Stream The creation of a stream is roughly divided into 4 types, the most commonly used is to create it through a collection
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 intermediate operationsStream Intermediate operations, our most commonly used ones are filtering, deduplication, and sorting. This chapter includes the most commonly used deduplication of objects and updating of objects in our development. Sorting attribute combinations
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);
}
}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 termination operationThe termination operation of Stream , the most commonly used The purpose is to collect the processed data into a new container, and at the same time, it can achieve some effects of grouping to Sql aggregation functions
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 features
Lazy execution of intermediate operations
If there are multiple intermediate operations, they will not cycle multiple times.Multiple conversion operations will only be merged when the operation is terminated, and one cycle will be completed.
- Internal iteration
- The iteration after finding the data that meets the conditions will not proceed
- Flow There is only one end operation for
Exception: stream has already been operated upon or closed
stream is closed and cannot be called again. If we want to call it repeatedly, we can only reopen a new stream.
The above is the detailed content of How to use Stream in Java8. For more information, please follow other related articles on the PHP Chinese website!
Hot AI Tools
Undress AI Tool
Undress images for free
Undresser.AI Undress
AI-powered app for creating realistic nude photos
AI Clothes Remover
Online AI tool for removing clothes from photos.
Clothoff.io
AI clothes remover
Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!
Hot Article
Hot Tools
Notepad++7.3.1
Easy-to-use and free code editor
SublimeText3 Chinese version
Chinese version, very easy to use
Zend Studio 13.0.1
Powerful PHP integrated development environment
Dreamweaver CS6
Visual web development tools
SublimeText3 Mac version
God-level code editing software (SublimeText3)
What is a deadlock in Java and how can you prevent it?
Aug 23, 2025 pm 12:55 PM
AdeadlockinJavaoccurswhentwoormorethreadsareblockedforever,eachwaitingforaresourceheldbytheother,typicallyduetocircularwaitcausedbyinconsistentlockordering;thiscanbepreventedbybreakingoneofthefournecessaryconditions—mutualexclusion,holdandwait,nopree
How to use Optional in Java?
Aug 22, 2025 am 10:27 AM
UseOptional.empty(),Optional.of(),andOptional.ofNullable()tocreateOptionalinstancesdependingonwhetherthevalueisabsent,non-null,orpossiblynull.2.CheckforvaluessafelyusingisPresent()orpreferablyifPresent()toavoiddirectnullchecks.3.Providedefaultswithor
Java Persistence with Spring Data JPA and Hibernate
Aug 22, 2025 am 07:52 AM
The core of SpringDataJPA and Hibernate working together is: 1. JPA is the specification and Hibernate is the implementation, SpringDataJPA encapsulation simplifies DAO development; 2. Entity classes map database structures through @Entity, @Id, @Column, etc.; 3. Repository interface inherits JpaRepository to automatically implement CRUD and named query methods; 4. Complex queries use @Query annotation to support JPQL or native SQL; 5. In SpringBoot, integration is completed by adding starter dependencies and configuring data sources and JPA attributes; 6. Transactions are made by @Transactiona
Java Cryptography Architecture (JCA) for Secure Coding
Aug 23, 2025 pm 01:20 PM
Understand JCA core components such as MessageDigest, Cipher, KeyGenerator, SecureRandom, Signature, KeyStore, etc., which implement algorithms through the provider mechanism; 2. Use strong algorithms and parameters such as SHA-256/SHA-512, AES (256-bit key, GCM mode), RSA (2048-bit or above) and SecureRandom; 3. Avoid hard-coded keys, use KeyStore to manage keys, and generate keys through securely derived passwords such as PBKDF2; 4. Disable ECB mode, adopt authentication encryption modes such as GCM, use unique random IVs for each encryption, and clear sensitive ones in time
LOL Game Settings Not Saving After Closing [FIXED]
Aug 24, 2025 am 03:17 AM
IfLeagueofLegendssettingsaren’tsaving,trythesesteps:1.Runthegameasadministrator.2.GrantfullfolderpermissionstotheLeagueofLegendsdirectory.3.Editandensuregame.cfgisn’tread-only.4.Disablecloudsyncforthegamefolder.5.RepairthegameviatheRiotClient.
How to use the Pattern and Matcher classes in Java?
Aug 22, 2025 am 09:57 AM
The Pattern class is used to compile regular expressions, and the Matcher class is used to perform matching operations on strings. The combination of the two can realize text search, matching and replacement; first create a pattern object through Pattern.compile(), and then call its matcher() method to generate a Matcher instance. Then use matches() to judge the full string matching, find() to find subsequences, replaceAll() or replaceFirst() for replacement. If the regular contains a capture group, the nth group content can be obtained through group(n). In actual applications, you should avoid repeated compilation patterns, pay attention to special character escapes, and use the matching pattern flag as needed, and ultimately achieve efficient
Edit bookmarks in chrome
Aug 27, 2025 am 12:03 AM
Chrome bookmark editing is simple and practical. Users can enter the bookmark manager through the shortcut keys Ctrl Shift O (Windows) or Cmd Shift O (Mac), or enter through the browser menu; 1. When editing a single bookmark, right-click to select "Edit", modify the title or URL and click "Finish" to save; 2. When organizing bookmarks in batches, you can hold Ctrl (or Cmd) to multiple-choice bookmarks in the bookmark manager, right-click to select "Move to" or "Copy to" the target folder; 3. When exporting and importing bookmarks, click the "Solve" button to select "Export Bookmark" to save as HTML file, and then restore it through the "Import Bookmark" function if necessary.
'Java is not recognized' Error in CMD [3 Simple Steps]
Aug 23, 2025 am 01:50 AM
IfJavaisnotrecognizedinCMD,ensureJavaisinstalled,settheJAVA_HOMEvariabletotheJDKpath,andaddtheJDK'sbinfoldertothesystemPATH.RestartCMDandrunjava-versiontoconfirm.


