一、Stream流简介
Stream也叫Stream流,是Jdk8开始新增的一套API (java.util.stream.),可以用于操作集合或者数组的数据。
优势: Stream流大量的结合了Lambda的语法风格来编程,提供了一种更加强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好。
使用stream流:
public static void main(String[] args) {
// Stream流的使用
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
// 1、拿出姓张的放到新集合中去。
// List<String> newList = new ArrayList<>();
// for (String s : list) {
// if(s.startsWith("张") && s.length() == 3) {
// newList.add(s);
// }
// }
// System.out.println(newList);
// 2、使用Stream流
List<String> newList = list.stream().filter(s -> s.startsWith("张") && s.length() == 3).collect(Collectors.toList());
System.out.println(newList);
}
运行结果:

二、使用Stream流
使用Stream流步骤:
1.获取Stream流,
2.调用方法,
3.获取结果。
1.获取Stream流:
public static void main(String[] args) {
// 获取Stream流。
// 1、获取集合的Stream流: default Stream<E> stream()
Collection<String> list = new ArrayList<>();
Collections.addAll(list, "张无忌", "周芷若","赵敏","张强","张三丰");
Stream<String> listS = list.stream();
System.out.println(listS.count());//打印数量;
// 2、获取Map集合的Stream流。
Map<String,Integer> map = new HashMap<>();
// 1)、获取键流。
Stream<String> keyS = map.keySet().stream();
// 2)、获取值流。
Stream<Integer> valueS = map.values().stream();
// 3)、获取键值对流。
Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream();
// 3、获取数组的Stream
String[] names = {"赵敏", "王菲", "小昭"};
Stream<String> stream1 = Arrays.stream(names);
Stream<String> stream2 = Stream.of(names);
}
2.Stream流常见的方法:
public static void main(String[] args) {
// Stream流的常见方法。
List<String> list = new ArrayList<>();
Collections.addAll(list, "张无忌", "周芷若","赵敏","张强","张三丰");
// 1、过滤方法
list.stream().filter(s -> s.startsWith("张") ).filter(s ->s.length() == 3).forEach(s -> System.out.println(s));
}
public static void main(String[] args) {
// tream流的常见方法。
List<String> list = new ArrayList<>();
Collections.addAll(list, "张无忌", "周芷若","赵敏","张强","张三丰");
// 1、过滤方法
list.stream().filter(s -> s.startsWith("张") ).forEach(s -> System.out.println(s));
// 2、准备一个集合,排序。
List<Movie> movies = new ArrayList<>();
movies.add(new Movie("摔跤吧,爸爸", 9.5, "阿米尔汗"));
movies.add(new Movie("三傻宝莱坞", 8.5, "阿米尔汗2"));
movies.add(new Movie("三傻宝莱坞", 8.5, "阿米尔汗2"));
movies.add(new Movie("阿甘正传", 7.5, "汤姆汉克斯"));
// 集合中如果存储对象,方式一:对象类可以实现Comparable接口,指定比较规则
// sorted方法就可以按照规则进行排序,否则报错!
movies.stream().sorted().forEach(s -> System.out.println(s));
System.out.println("-----------------------------------------------01");
movies.stream().sorted((m1, m2) -> Double.compare(m2.getScore(), m1.getScore()))
.forEach(System.out::println);
// 3、limit取前几个
System.out.println("-----------------------------------------------limit ");
movies.stream().sorted((m1, m2) -> Double.compare(m2.getScore(), m1.getScore()))
.limit(2).forEach(System.out::println);
// 4、跳过前几个skip
System.out.println("-----------------------------------------------skip ");
movies.stream().sorted((m1, m2) -> Double.compare(m2.getScore(), m1.getScore()))
.skip(1).forEach(System.out::println);
// 5、distinct去重复
System.out.println("----------------------------------------------- distinct");
// 去重复:需要重写对象类的hashCode和equals方法
movies.stream().sorted((m1, m2) -> Double.compare(m2.getScore(), m1.getScore()))
.distinct().forEach(System.out::println);
// 6、map加工方法:把流上的数据加工成新数据。
System.out.println("-----------------------------------------------map加工");
movies.stream().map(m -> {
m.setScore(m.getScore() + 2);
return m;
}).forEach(System.out::println);
// 7、合并流。
// 把两个流接起来 。
Stream<String> s1 = Stream.of("张三", "楚留香", "西门牛牛");
Stream<String> s2 = Stream.of("李四", "石景山");
Stream<String> allStream = Stream.concat(s1, s2);
long count = allStream.count(); // count:统计个数
System.out.println(count);
}
运行如图:

- Stream流的常见终结方法
public static void main(String[] args) {
// Stream流的常见终结方法。
List<Movie> movies = new ArrayList<>();
movies.add(new Movie("摔跤吧,爸爸", 9.5, "阿米尔汗0"));
movies.add(new Movie("三傻宝莱坞", 8.5, "阿米尔汗1"));
movies.add(new Movie("三傻宝莱坞", 8.5, "阿米尔汗2"));
movies.add(new Movie("阿甘正传", 7.5, "汤姆汉克斯"));
// 1、forEach
movies.stream().forEach(System.out::println);
System.out.println("-----------------------------------------------01");
// 2、count
long count = movies.stream().skip(2).count();
System.out.println(count);
// 3、取最大值
Movie movie = movies.stream().max((m1, m2) -> Double.compare(m1.getScore(), m2.getScore())).get();
System.out.println(movie);
Movie movie2 = movies.stream().min((m1, m2) -> Double.compare(m1.getScore(), m2.getScore())).get();
System.out.println(movie2);
// 4、收集Stream流:把流中的数据恢复到集合或者数组中去。
List<String> list = new ArrayList<>();
list.add("张无忌");
list.add("周芷若");
list.add("赵敏");
list.add("张强");
list.add("张三丰");
list.add("张三丰");
// 收集到List集合
List<String> names = list.stream().filter(s -> s.startsWith("张")).collect(Collectors.toList());
System.out.println(names);
names.add("张麻子");
System.out.println(names);
// 收集到Set集合
Set<String> names2 = list.stream().filter(s -> s.startsWith("张")).collect(Collectors.toSet());
System.out.println(names2);
names2.add("张麻子");
System.out.println(names2);
// 收集到数组
Object[] names3 = list.stream().filter(s -> s.length() == 3).toArray();
System.out.println(Arrays.toString(names3));
// 拓展
// String[] names4 = list.stream().filter(s -> s.length() == 3).toArray(String[]::new);
// System.out.println(Arrays.toString(names4));
// 收到到Map集合。
List<Movie> movies1 = new ArrayList<>();
movies1.add(new Movie("摔跤吧,爸爸", 9.5, "阿米尔汗"));
movies1.add(new Movie("三傻宝莱坞", 8.5, "阿米尔汗2"));
movies1.add(new Movie("三傻宝莱坞", 8.5, "阿米尔汗2"));
movies1.add(new Movie("阿甘正传", 7.5, "汤姆汉克斯"));
Map<String, Double> map = movies1.stream().distinct().collect(Collectors.toMap(m -> m.getName(), m -> m.getScore()));
System.out.println(map);
}
浙公网安备 33010602011771号