JavaSe—Stream流☆
目录
1、认识Stream流
stream流的使用步骤
2、步骤1:获取stream流
3、步骤2:Stream流常用的方法
4、步骤3:Stream流的终极方法
5、收集Stream流
1、认识Stream流
- streamjdk8开始新增的一套API(java.util.stream.*),可以用于操作集合或者数组的数据。
一些集合或者数组都有相应的方法进行操作数据为什么还要使用stream流呢?stream有什么优势呢?
- 优势:Stream流大量的结合了Lambda的语法风格编程,功能强大,性能高效,代码简洁,可读性好。
体验Stream流

上面需求的代码实现,使用了传统的方法和Stream流两种方法:
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;public class Demo3Stream {public static void main(String[] args) {//目标:认识stream 流,掌握stream 的基本使用,体会它的好处List<String> list = new ArrayList<>(); //创建数组列表list.add("张三");list.add("张三丰");list.add("熊大");list.add("赵敏");list.add("张无忌");list.add("张翠山");list.add("光头强");list.add("小龙女");//1、现在要将所有以张开头且3字符的元素,存储到一个新集合//方式1、使用传统方案//startsWith 判断字符串开头前缀List<String> list2 = new ArrayList<>();for (String s : list) {if(s.startsWith("张") && s.length() == 3){list2.add(s);}}System.out.println(list2);//方式2、使用 stream流System.out.println(list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).collect(Collectors.toList()));}
}
/*
[张三丰, 张无忌, 张翠山]
[张三丰, 张无忌, 张翠山]*/
stream流的使用步骤

2、步骤1:获取stream流
- 获取集合的stream流。

import java.util.*;
import java.util.stream.IntStream;
import java.util.stream.Stream;public class StreamDemo2 {public static void main(String[] args) { //获取stream流//1、获取集合的stream流Collection<String> list = new ArrayList<>();Stream<String> streamList =list.stream(); //获取集合的stream流//2、获取Map集合的stream流Map<String, String> map = new HashMap<>();//map.stream(); //报错//获得Map集合键的stream流Stream<String> keyStream= map.keySet().stream();//获取Map值的stream流Stream<String > valuesStream = map.values().stream();//获取键值对的stream流Stream<Map.Entry<String, String>> EntryStream = map.entrySet().stream();//3、获取数数组的stream流String[] arr = {"张三", "李四", "王五"};//方法1、Stream<String> streamArr = Arrays.stream(arr); ////方法2、Stream<String> streamArr2 = Stream.of(arr);Stream<String> streamArr3 = Stream.of("张三", "李四", "王五"); //这里可以传入多个参数}
}
3、步骤2:Stream流常用的方法

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;public class Demo4Stream {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("熊大");list.add("张三丰");list.add("张无忌");list.add("张翠山");//对流中的数据进行过滤,只保留姓张的Stream<String> streamlist = list.stream().filter(s -> s.startsWith("张"));streamlist.forEach(System.out::println);//sorted 排序对元素进行排序List<Double> list2 = new ArrayList<>();list2.add(4.1);list2.add(2.1);list2.add(3.1);list2.add(1.1);list2.add(1.1);list2.add(1.1);System.out.println("——————————排序——————————");Stream<Double> streamsorted = list2.stream().sorted();streamsorted.forEach(System.out::println); //1.1 2.1 3.1 4.1System.out.println("———————————自定义排序———————————");Stream<Double> stream2 = list2.stream().sorted((d1,d2)->d2.compareTo(d1));stream2.forEach(System.out::println);System.out.println("——————————————谋取前几个元素————————————————");Stream<Double> stream3 = list2.stream().sorted().limit(2);stream3.forEach(System.out::println);System.out.println("——————————————————跳过前几个元素—————————————————————");Stream<Double> stream4 = list2.stream().sorted().skip(2);stream4.forEach(System.out::println);System.out.println("_______________________去重____________________");Stream<Double> stream5 = list2.stream().distinct();stream5.forEach(System.out::println);System.out.println("_____________________映射_____________________");Stream<Double> stream6 = list2.stream().map(d -> d * 2).distinct();stream6.forEach(System.out::println);System.out.println("_____________________合并_____________________");Stream<Double> stream7 = Stream.of(1.1,2.2,3.3);Stream<Double> stream8 = Stream.of(4.4,5.5,6.6);Stream<Double> stream9 = Stream.concat(stream7,stream8);stream9.forEach(System.out::println);}
}
/*
张三丰
张无忌
张翠山
——————————排序——————————
1.1
1.1
1.1
2.1
3.1
4.1
———————————自定义排序———————————
4.1
3.1
2.1
1.1
1.1
1.1
——————————————谋取前几个元素————————————————
1.1
1.1
——————————————————跳过前几个元素—————————————————————
1.1
2.1
3.1
4.1
_______________________去重____________________
4.1
2.1
3.1
1.1
_____________________映射_____________________
8.2
4.2
6.2
2.2
_____________________合并_____________________
1.1
2.2
3.3
4.4
5.5
6.6*/
4、步骤3:Stream流的终极方法
- 终结方法指的是调用完成后,不会返回新的Stream流了,没法继续使流了。

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;public class Demo5Stream {public static void main(String[] args) {List<Teacher> list = new ArrayList<>();list.add(new Teacher("张三", 18, 5000));list.add(new Teacher("张三丰", 50, 5006));list.add(new Teacher("张无忌", 20, 66008));list.add(new Teacher("张翠山", 30, 4000));list.add(new Teacher("赵敏", 18, 15000));list.stream().filter(t -> t.getSalary() > 10000).forEach(System.out::println);System.out.println("-----------------");long count = list.stream().count();System.out.println(count);System.out.println("-----------------");Optional<Teacher>max = list.stream().max((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));System.out.println(max.get()); //输出最大值对象System.out.println("-----------------");Optional<Teacher>min = list.stream().min((t1, t2) -> Double.compare(t1.getSalary(), t2.getSalary()));System.out.println(min.get());}
}/*Teacher{name='张无忌', age=20, salary=66008.0}
Teacher{name='赵敏', age=18, salary=15000.0}
-----------------
5
-----------------
Teacher{name='张无忌', age=20, salary=66008.0}
-----------------
Teacher{name='张翠山', age=30, salary=4000.0}*/
5、收集Stream流
- 收集Stream流:就是把Stream流操作后的结果传回到集合或者数组去返回。
- Stream流:方便操作集合/数组的手段;
- 集合/数组:才是开发中的目的。

import java.util.*;
import java.util.stream.Collectors;public class Demo6Stream {public static void main(String[] args) {//一个流只能收集一次System.out.println("--------------收集到List集合---------------------");List<String> list = new ArrayList<>();list.add("张三");list.add("张三丰");list.add("张无忌");list.add("熊大");list.add("赵敏");//把流收集到List集合List<String> li = list.stream().collect(Collectors.toList());li.forEach(System.out::println);System.out.println("--------------收集到Set集合---------------------");List<String> list1 = new ArrayList<>();list1.add("张三");list1.add("张三丰");list1.add("张无忌");list1.add("熊大");list1.add("赵敏");//把流收集到Set集合Set<String> set = list1.stream().collect(Collectors.toSet());System.out.println( set);System.out.println("--------------收集到Map集合---------------------");//把流收集到Map集合List<Teacher1> list2 = new ArrayList<>();list2.add(new Teacher1("张三", 5000));list2.add(new Teacher1("张三丰", 5006));list2.add(new Teacher1("张无忌", 15008));
// Map<String, Double> map = list2.stream().collect(Collectors.toMap(new Function<Teacher1, String>() {
// @Override
// public String apply(Teacher1 teacher1) {
// return teacher1.getName();
// }
// }, new Function<Teacher1, Double>() {
// @Override
// public Double apply(Teacher1 teacher1) {
// return teacher1.getSalary();
// }
// }));//优化Map<String, Double> map = list2.stream().collect(Collectors.toMap(Teacher1::getName, Teacher1::getSalary));System.out.println( map);System.out.println("--------------收集到数组---------------------");List<String> list3 = new ArrayList<>();list3.add("张三");list3.add("张三丰");list3.add("张无忌");list3.add("熊大");list3.add("赵敏");Object[] arr = list3.stream().toArray();System.out.println(Arrays.toString(arr));}
}
/*
--------------收集到List集合---------------------
张三
张三丰
张无忌
熊大
赵敏
--------------收集到Set集合---------------------
[张三, 熊大, 张三丰, 赵敏, 张无忌]
--------------收集到Map集合---------------------
{张三=5000.0, 张三丰=5006.0, 张无忌=15008.0}
--------------收集到数组---------------------
[张三, 张三丰, 张无忌, 熊大, 赵敏]*/
