在Java中,Stream(流)是一种用于处理集合数据的高级抽象概念。Java Stream API 提供了一种功能强大且表达力高的方式来处理数据集合,包括集合、数组等。使用Stream,可以更简洁、更具表达力地进行数据转换、过滤、映射、聚合等操作,同时还能利用多核处理器进行并行操作。以下是Java Stream 流的一些主要作用:
-
函数式风格的数据处理: 使用Stream,你可以以函数式风格处理数据,通过链式调用方法来进行各种数据操作。这使代码更易读、易于组合和重用。
-
数据转换和映射: Stream提供了
map操作,可以将一个元素映射为另一个元素,从而进行数据转换。例如,可以将一个集合中的每个元素映射为另一种类型的元素。 -
数据过滤: 使用
filter操作,可以根据特定条件筛选出符合条件的元素。这在从大型数据集中提取所需数据时非常有用。 -
数据聚合和归约: Stream提供了
reduce操作,可以对集合中的元素进行归约操作,例如计算总和、最大值、最小值等。 -
并行处理: Stream可以通过并行操作,在多核处理器上同时处理数据,从而提高处理速度。通过
parallelStream()方法,可以将Stream转换为并行流。 -
延迟执行: Stream中的操作通常是延迟执行的,即只有在终止操作(如
forEach、collect)被调用时,才会实际开始执行操作。这使得Stream可以对操作进行优化,例如只计算实际需要的数据。 -
流水线操作: Stream允许将多个操作连接成流水线,每个操作依次应用于流中的元素。这种方式使得代码结构清晰,易于理解。
-
简化代码: 使用Stream可以大大减少需要编写的中间临时变量和循环代码,使代码更加简洁。
stream 的一些基础代码
操作集合和数组的
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
public class StreamTest {
public static void main(String[] args) {
//stream流:操作数组或集合得一个知识点
ArrayList<String> list = new ArrayList<>();
Collections.addAll(list,"陈某人","陈某某","陈陈某","某某人","陈某","某人");
//需要找出:姓陈,并且名字为三个字得
ArrayList<String> arrayList = new ArrayList<>();
for (String s : list) {
if (s.startsWith("陈") && s.length()==3){
arrayList.add(s);
}
}
System.out.println("---------------------------------");
System.out.println(arrayList);
//使用stream流实现这个需求
List<String> strings = list.stream().filter(s -> s.startsWith("陈") && s.length() == 3)
.collect(Collectors.toList());
System.out.println(strings);
}
}
Stream类流的创建
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StreamTest {
public static void main(String[] args) {
//list
List<String> list = new ArrayList<>();
Collections.addAll(list,"陈某人","陈某某","陈陈某","某某人","陈某","某人");
Stream<String> stream = list.stream();
//set
HashSet<String> set = new HashSet<>();
Collections.addAll(set,"陈某人","陈某某","陈陈某","某某人","陈某","某人");
Stream<String> stream1 = set.stream();
//Map
HashMap<String, Integer> map = new HashMap<>();
//通过key 获取Stream流
Set<String> keySet = map.keySet();
Stream<String> stream2 = keySet.stream();
//通过value 获取Stream流
Collection<Integer> values = map.values();
Stream<Integer> stream3 = values.stream();
//通过entrySet获取Stream流
Set<Map.Entry<String, Integer>> entries = map.entrySet();
Stream<Map.Entry<String, Integer>> stream4 = entries.stream();
//数组
String[] names = {"陈某人","陈某某","陈陈某","某某人","陈某","某人"};
//names.stream: idea快捷键生成Arrays.stream(names)
Stream<String> stream5 = Arrays.stream(names);
Stream<String> names1 = Stream.of(names);
}
}
Stream类流的使用
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class StudentDemo {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<>();
Student s1 = new Student("张三", 20, 95.2);
Student s2 = new Student("张四", 21, 54.2);
Student s3 = new Student("张五", 22, 93.2);
Student s4 = new Student("张六", 23, 42.2);
Student s5 = new Student("张七", 24, 41.2);
Student s6 = new Student("张八", 26, 90.2);
Student s7 = new Student("张九", 19, 49.2);
Student s8 = new Student("张十", 22, 88.2);
Collections.addAll(list, s1, s2, s3, s4, s5, s6, s7, s8);
System.out.println("======================输出高于60分的=========================");
list.stream()
//过滤
.filter(student -> student.getScore() >= 60)
//排序
.sorted(Comparator.comparingDouble(Student::getScore))
//遍历集合打印元素信息
.forEach(System.out::println);
System.out.println("======================输出年龄在23-30之内的=========================");
//注意一:sorted有参方法:定义比较器,来定义排序顺序
list.stream()
.filter(student -> student.getAge() >= 23 && student.getAge() <= 30)
.sorted((o1, o2) -> o2.getAge() - o1.getAge())
.forEach(System.out::println);
System.out.println("=====================取前三位==========================");
//取出成绩最高的前三的学生,并输出 取集合前三的值
list.stream()
.sorted((o1, o2) -> Double.compare(o2.getScore(), o1.getScore()))
.limit(3)
.forEach(System.out::println);
System.out.println("=====================取后三位==========================");
//取最后三位
list.stream()
.sorted((o1, o2) -> Double.compare(o2.getScore(), o1.getScore()))
// 减 3 就是取最后3位
.skip(list.size() - 3)
.forEach(System.out::println);
System.out.println("===============打印超50分学生的名字,重复的去除==================");
//打印超50分的学生的名字 有重复的去除
list.stream().filter(student -> student.getScore() > 50)
//加工:把student类型的元素转为String类型的元素
.map(student -> student.getName())
//去重
.distinct()
.forEach(System.out::println);
System.out.println("===================使用CONCAT连续两个流========================");
Stream<String> stream1 = Stream.of("张三", "李四", "王五");
Stream<String> stream2 = Stream.of("李三", "张四", "梁五");
Stream<String> concat = Stream.concat(stream1, stream2);
concat.forEach(System.out::println);
//打印超五十分的
System.out.println("=================统计超50分的人数===================");
long count = list.stream().filter(student -> student.getScore() > 50).count();
System.out.println("人数为:" + count);
System.out.println("=====================找出最高分的======================");
//找出最高分的
Student max = list.stream().max((o1, o2) -> Double.compare(o1.getScore(), o2.getScore())).get();
System.out.println(max);
System.out.println("=====================找出最低分的======================");
Student min = list.stream().min((o1, o2) -> Double.compare(o1.getScore(), o2.getScore())).get();
System.out.println(min);
System.out.println("=====================找出80分以上的======================");
Set<Student> collect = list.stream().filter(student -> student.getScore() > 80).collect(Collectors.toSet());
for (Student student : collect) {
System.out.println(student);
}
System.out.println("=====================流只能用一次======================");
Set<Student> collect1 = list.stream().filter(student1 -> student1.getScore() > 80).collect(Collectors.toSet());
System.out.println(collect1);
System.out.println("=====================找出80分以上的学生并存Map集合里======================");
Map<String, Double> map = list.stream()
.filter(student1 -> student1.getScore() > 80)
.distinct()
.collect(Collectors.toMap(student1 -> student1.getName(), student1 -> student1.getScore()));
System.out.println(map);
}
}
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.function.Function;
import java.util.stream.Collectors;
public class Test02 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
String[] strings = {"张三", "李大牛", "压缩哈撒keO咯", "超级无敌奥特曼", "扇子妈", "女枪", "大炮", "飞机坦克", "超级无敌宇宙飞船", "女枪"};
Collections.addAll(list, strings);
System.out.println("==========最长的三个元素=============");
list.stream().sorted((str, str1) -> str1.length() - str.length()).limit(3).distinct().forEach(System.out::println);
System.out.println("===========最短的三个元素============");
list.stream().distinct().sorted(Comparator.comparingInt(String::length)).limit(3).forEach(System.out::println);
System.out.println("===========去重后集合的元素============");
list.stream().distinct().forEach(System.out::println);
System.out.println("===========遍历打印Set集合的元素============");
list.stream().collect(Collectors.toSet()).forEach(System.out::println);
System.out.println("==========遍历打印map集合的元素=============");
list.stream().collect(Collectors.toMap(Function.identity(), s -> 1, Integer::sum)).forEach((key, value) -> System.out.println(key + "==" + value));
}
}