追风赶月莫停留,平芜尽处是春山
Stream流的优点
- 直接阅读代码的字面意思即可完美展示无关逻辑方式的语义:获取流、过滤姓张、过滤长度为3、逐一打印
- Stream流把真正的函数式编程风格引入到Java中
- 代码简洁
案例需求
按照下面的要求完成集合的创建和遍历
- 创建一个集合,存储多个字符串元素
- 把集合中所有以”张”开头的元素存储到一个新的集合
- 把”张”开头的集合中的长度为3的元素存储到一个新的集合
- 遍历上一步得到的集合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class MyStream1 { public static void main(String[] args) { ArrayList<String> list1 = new ArrayList<>(List.of("张三丰","张无忌","张翠山","王二麻子","张良","谢广坤"));
ArrayList<String> list2 = new ArrayList<>(); for (String s : list1) { if(s.startsWith("张")){ list2.add(s); } } ArrayList<String> list3 = new ArrayList<>(); for (String s : list2) { if(s.length() == 3){ list3.add(s); } } for (String s : list3) { System.out.println(s); } } }
|
1 2 3 4 5 6 7 8 9 10 11
| public class StreamDemo { public static void main(String[] args) { ArrayList<String> list1 = new ArrayList<>(List.of("张三丰","张无忌","张翠山","王二麻子","张良","谢广坤"));
list1.stream().filter(s->s.startsWith("张")) .filter(s->s.length() == 3) .forEach(s-> System.out.println(s)); } }
|
Stream流的常见生成方式
Stream流的作用
结合Lambda表达式,简化集合、数组的操作
Stream流的使用步骤
- 先得到一条Stream流(流水线),并把数据放上去


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public class StreamDemo { public static void main(String[] args) { List<String> list = new ArrayList<String>(); Stream<String> listStream = list.stream(); Set<String> set = new HashSet<String>(); Stream<String> setStream = set.stream(); Map<String,Integer> map = new HashMap<String, Integer>(); Stream<String> keyStream = map.keySet().stream(); Stream<Integer> valueStream = map.values().stream(); Stream<Map.Entry<String, Integer>> entryStream = map.entrySet().stream().forEach(s->{System.out.println(s)}); String[] strArray = {"hello","world","java"}; Stream<String> strArrayStream = Arrays.stream(strArray); Stream<String> strArrayStream2 = Stream.of("hello", "world", "java"); Stream<Integer> intStream = Stream.of(10, 20, 30); } }
|
- 使用中间方法对流水线上的数据进行操作
- 使用终结方法对流水线上的数据进行操作

Stream流的中间方法

注意1:中间方法,返回新的Stream流,原来的Stream流只能使用一次,建议使用链式编程
注意2:修改Stream流中的数据,不会影响原来集合或数组中的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| public class MyStream3 { public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>(); list.add("张三丰"); list.add("张无忌"); list.add("张翠山"); list.add("王二麻子"); list.add("张良"); list.add("谢广坤");
list.stream().filter(s ->s.startsWith("张")).forEach(s-> System.out.println(s)); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public class StreamDemo02 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>();
list.add("林青霞"); list.add("张曼玉"); list.add("王祖贤"); list.add("柳岩"); list.add("张敏"); list.add("张无忌");
list.stream().limit(3).forEach(s-> System.out.println(s)); System.out.println("--------");
list.stream().skip(3).forEach(s-> System.out.println(s)); System.out.println("--------");
list.stream().skip(2).limit(2).forEach(s-> System.out.println(s)); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| public class StreamDemo03 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>();
list.add("林青霞"); list.add("张曼玉"); list.add("王祖贤"); list.add("柳岩"); list.add("张敏"); list.add("张无忌");
Stream<String> s1 = list.stream().limit(4);
Stream<String> s2 = list.stream().skip(2);
Stream.concat(s1,s2).distinct().forEach(s-> System.out.println(s)); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| package stream;
import java.util.ArrayList; import java.util.Collections; import java.util.function.Function;
public class StreamDemo1 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); Collections.addAll(list,"张三丰-35","Alie-15","Mike-20","John-24","Alan-19","iKun-23","Angle-28","Elen-30");
list.stream() .skip(2) .limit(3) .forEach(s -> System.out.println(s));
System.out.println("=====================================");
list.stream() .map(s -> Integer.parseInt(s.split("-")[1])) .forEach(age-> System.out.println(age)); } }
|
Stream流的终结方法

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| public class MyStream5 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("张三丰"); list.add("张无忌"); list.add("张翠山"); list.add("王二麻子"); list.add("张良"); list.add("谢广坤"); long count = list.stream().count(); System.out.println(count); } private static void method1(ArrayList<String> list) { list.stream().forEach( new Consumer<String>() { @Override public void accept(String s) { System.out.println(s); } } ); System.out.println("===================="); list.stream().forEach( (String s)->{ System.out.println(s); } ); System.out.println("===================="); list.stream().forEach(s->System.out.println(s)); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| package stream;
import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.function.IntFunction;
public class StreamDemo2 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); Collections.addAll(list, "张三丰", "Alie", "Mike", "John", "Alan", "iKun", "Angle", "Elen");
long count = list.stream().count(); System.out.println(count);
Object[] array = list.stream().toArray(); System.out.println(Arrays.toString(array));
System.out.println("===============================");
String[] strings = list.stream().toArray(new IntFunction<String[]>() { @Override public String[] apply(int value) { return new String[value]; } }); System.out.println(Arrays.toString(strings));
System.out.println("===================================");
String[] array1 = list.stream().toArray(num -> new String[num]); System.out.println(Arrays.toString(array1));
} }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
| public class MyStream7 { public static void main(String[] args) { ArrayList<Integer> list1 = new ArrayList<>(); for (int i = 1; i <= 10; i++) { list1.add(i); } list1.add(10); list1.add(10); list1.add(10); list1.add(10); list1.add(10); List<Integer> list = list1.stream().filter(number -> number % 2 == 0) .collect(Collectors.toList()); System.out.println(list); Set<Integer> set = list1.stream().filter(number -> number % 2 == 0) .collect(Collectors.toSet()); System.out.println(set); } }
public class MyStream8 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); list.add("zhangsan,23"); list.add("lisi,24"); list.add("wangwu,25"); Map<String, Integer> map = list.stream().filter( s -> { String[] split = s.split(","); int age = Integer.parseInt(split[1]); return age >= 24; } ).collect(Collectors.toMap( s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1]) )); System.out.println(map); } }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| package stream;
import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors;
public class StreamDemo3 { public static void main(String[] args) { ArrayList<String> list = new ArrayList<>(); Collections.addAll(list, "张三丰-男-23", "张三丰-男-23","Alie-女-24", "Mike-男-25", "John-男-26", "Alan-男-27", "iKun-男-28", "Angle-女-29", "Elen-女-30");
List<String> list1 = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toList()); System.out.println(list1);
Set<String> set = list.stream().filter(s -> "男".equals(s.split("-")[1])).collect(Collectors.toSet()); System.out.println(set);
}
|
将数据收集到map集合中,键不能重复,否则会报错

