Java的Stream流【详解】
目录
一.概念
二.Stream流处理数据的步骤
1.得到集合或者数组的Stream流。
2.调用Stream流的中间方法对数据进行处理
3.调用Stream流的终结方法获取处理的结果
一.概念
是Jdk8开始新增的一套API (java.util.stream.*),可以用于操作集合或者数组的数据。
好处:
Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。
二.Stream流处理数据的步骤
1.得到集合或者数组的Stream流。
获取集合对象的Stream流:default Stream<E> stream()
获取数组对象的Stream流:
Arrays类提供的静态方法 public static <T> Stream<T> stream(T[] array)
Stream类提供的静态方法 public static<T> Stream<T> of(T... values)

package com.itheima.day08.teacher.stream;import java.util.*;
import java.util.stream.Stream;public class StreamDemo01 {/*掌握如何获取 List的Stream流如何获取 Set的Stream流单列集合对象.stream()如何获取 Map的Stream流变成单列之后 在 .stream()如果获取 数组的Stream流Arrays.stream(数组)Stream.of(数组)将集合中的数据放到流水线上。*/public static void main(String[] args) {//1 List的Stream流List<String> names = new ArrayList<>();Collections.addAll(names,"蔡徐坤","小黑子","ikun","鸡你太美");// 数据转换到流上Stream<String> stream1 = names.stream();//2 Set的Stream流Set<String> set = new HashSet<>();Collections.addAll(set,"蔡徐坤","小黑子","ikun","鸡你太美");// 数据转换到流上Stream<String> stream2 = names.stream();//3:如何获取 Map的Stream流Map<String,Integer> map = new HashMap<>();map.put("姚明",40);map.put("刘翔",42);map.put("郭敬明",44);// 键集 转换成Stream流Stream<String> stream31 = map.keySet().stream();// 值集 转换成Stream流Stream<Integer> stream32 = map.values().stream();//处理键值对呢? 键值对对象 叫entryStream<Map.Entry<String, Integer>> stream3 = map.entrySet().stream();//4:数组 的Stream流String[] array = {"蔡徐坤","小黑子","ikun","鸡你太美"};//两种方式Stream<String> stream4 = Arrays.stream(array);Stream<String> stream5 = Stream.of(array);}
}
2.调用Stream流的中间方法对数据进行处理
中间方法调用完成后会返回新的Stream流,可以继续使用(支持链式编程)

package com.itheima.day08.teacher.stream;import java.util.stream.Stream;public class StreamDemo02 {/*学习Stream流的中间方法*/public static void main(String[] args) {//将多个数据放到流水线上 形成新的Stream流Stream<String> stream1 = Stream.of("a", "b", "c", "d", "e", "f", "g");// limit(long n)流水线上取出前n个元素..形成一个新的流向 旧的流向已经关闭 (永不回头)
// Stream<String> limit = stream1.limit(3);// forEach(写处理每个数据的lambda表达式)// lambda ()->{}System.out.println("=================limit 取前几个======================");stream1.limit(3).forEach(s-> System.out.println(s));// forEach() 终结方法 从流水线上下来了。//============================System.out.println("=================skip跳过======================");Stream<String> stream2 = Stream.of("a", "b", "c", "d", "e", "f", "g");//跳过stream2.skip(4).forEach(s -> System.out.println(s));System.out.println("=============distinct去重==========================");Stream<String> stream3 = Stream.of("a", "b", "a", "d", "b", "b", "g");//终结方法
// System.out.println(stream3.count());
// stream3.skip(3); 报错 原因 count()终结long count = stream3.distinct().count();System.out.println("去重之后还有几个数据:"+count);System.out.println("============sorted排序=================");Stream<Integer> stream4 = Stream.of(911,119,111,114,110);stream4.sorted().forEach(s-> System.out.println(s));//默认排序System.out.println("============sorted排序 自定义排序规则=================");Stream<Integer> stream5 = Stream.of(911,119,111,114,110);stream5.sorted((o1,o2)->o2-o1).forEach(s-> System.out.println(s));//默认排序}
}----------------
package com.itheima.day08.teacher.stream;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;public class StreamDemo03 {/*学会使用Stream流的中间方法*/public static void main(String[] args) {List<Double> scores = new ArrayList<>();Collections.addAll(scores, 88.5, 100.0, 50.0);// sorted 排序 排序的规则 两个数据比较 (o1,o2)->{比较的规则}// sorted((o1,o2)->{排序的规则}) sorted() 默认规则// forEach(完成数据的遍历) 每次取出来每一个元素// forEach((s)->{处理s})// filter是过滤的功能 找出符合要求的数据 返回的结果是boolean// filter((s)->{return 判断语句;})// filter(s->判断语句)// 找出成绩大于等于60分的数据,并升序后,再输出。scores.stream().filter(s->s>=60).sorted().forEach(System.out::println);// map 一一映射 转换的意思// 将流中的Double类型数据 变成字符串类型
// Stream<Double> stream = scores.stream(); 流里面是 Double类型元素// map 将A 类型 转换成 B类型// Double---String// map((A s)->{return B类型;})// map(A类型参数->B类型数据)
// Stream<String> stringStream = scores.stream().map((Double d) -> {
// return d + "哈哈";
// });Stream<String> stringStream = scores.stream().map( d -> d + "哈哈");// Double类型 变成学生类型
// scores.stream().map((Double s)->{返回 学生对象})
// Stream<Student> studentStream = scores.stream().map((Double s) -> {
// return new Student("小明", 18, s);
// });Stream<Student> studentStream = scores.stream().map( s-> new Student("小明", 18, s));//苍穹外卖 项目后期 可以使用map进行类型转换。//合并流Stream<String> stream1 = Stream.of("a", "b", "c");Stream<String> stream2 = Stream.of("1", "2", "3");Stream<String> stream = Stream.concat(stream1, stream2);//两个流合并到一个流上了。}
}
3.调用Stream流的终结方法获取处理的结果
终结方法调用完成后,不会返回新Stream了,不能继续使用流了


代码演示:
package com.itheima.day08.teacher.stream;/*** 学生类*/
public class Student {private String name;private int age;private double score;public Student() {}public Student(String name, int age, double score) {this.name = name;this.age = age;this.score = score;}/*** 获取* @return name*/public String getName() {return name;}/*** 设置* @param name*/public void setName(String name) {this.name = name;}/*** 获取* @return age*/public int getAge() {return age;}/*** 设置* @param age*/public void setAge(int age) {this.age = age;}/*** 获取* @return score*/public double getScore() {return score;}/*** 设置* @param score*/public void setScore(double score) {this.score = score;}public String toString() {return "Student{name = " + name + ", age = " + age + ", score = " + score + "}";}
}--------------
package com.itheima.day08.teacher.stream;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;public class StreamDemo04 {/*学会使用Stream流的终结方法*/public static void main(String[] args) {List<Double> scores = new ArrayList<>();Collections.addAll(scores, 88.5, 100.0, 50.0);System.out.println(scores.stream().count());//求出该流中数据的个数scores.stream().forEach(s-> System.out.println(s));//对流中数据进行处理--输出System.out.println("===========求最大值==============");Double max = scores.stream().max((o1, o2) -> Double.compare(o2, o1)).get(); //按照正常前后顺序才能找到,翻过会找到最小值
// Double max = scores.stream().max(Double::compare).get();Double min = scores.stream().min((o1, o2) -> Double.compare(o1, o2)).get();System.out.println(max);System.out.println(min);List<Student> students = new ArrayList<>();students.add(new Student("小明",28,1.67));students.add(new Student("小李",26,1.98));students.add(new Student("小王",27,1.99));//求出身高最高的哪位同志
// Student student = students.stream().max((o1, o2) -> Double.compare(o1.getScore(), o2.getScore())).get();Student student = students.stream().max((o1, o2) -> Double.compare(o1.getScore(), o2.getScore())).get();System.out.println(student);}
}------------------
package com.itheima.day08.teacher.stream;import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class StreamTest01 {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("张歆艺");list.add("周杰伦");list.add("赵雷");list.add("张译");list.add("张学友");//把集合中所有以 张开头 且3个字的元素存储到新的集合中List<String> newList = new ArrayList<>();for (String name : list) {if(name.startsWith("张") && name.length()==3){newList.add(name);}}System.out.println(newList);// 将集合数据放到流水线上 进行 一步步的操作List<String> newList2 = list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).collect(Collectors.toList());System.out.println(newList2);}}