1 概述
- 在Java 8中,得益于Lambda所带来的函数式编程, 引入了一个全新的Stream流概念
- 目的:用于简化集合和数组操作的API
- Stream流核心思想
1、先得到集合或者数组的Stream流(就是一根传送带)
2、把元素放上去
3、然后就用这个Stream流简化的API来方便的操作元素
2 Stream流常用方法
2.1 Stream流获取
- 集合获取stream流的方式:可以用Collection接口中的默认方法stream()获取
名称 | 说明 |
---|
default Stream stream() | 获取当前集合对象的Stream流 |
- 数组获取stream流的方式:用Array静态方法stream(T[] array)或of(T… values)
名称 | 说明 |
---|
public static Stream stream(T[] array) | 获取当前数组的Stream流 |
public static Stream of(T… values) | 获取当前数组/可变数据的Stream流 |
Collection<String> list = new ArrayList<>();
Stream<String> s = list.stream();
Map<String, Integer> maps = new HashMap<>();
Stream<String> keyStream = maps.keySet().stream();
Stream<Integer> valueStream = maps.values().stream();
Stream<Map.Entry<String,Integer>> keyAndValueStream = maps.entrySet().stream();
String[] names = {"中国","美国","英国","法国"};
Stream<String> nameStream = Arrays.stream(names);
Stream<String> nameStream2 = Stream.of(names);
2.2 Stream流常用中间操作方法
名称 | 说明 |
---|
Stream filter(Predicate<? super T> predicate) | 用于对流中的数据进行过滤 |
Stream limit(long maxSize) | 获取前几个元素 |
Stream skip(long n) | 跳过前几个元素 |
Stream distinct() | 去除流中重复的元素。依赖(hashCode和equals方法) |
static Stream concat(Stream a, Stream b) | 合并a和b两个流为一个流 |
中间方法也称为非终结方法,调用完成后返回新的Stream流继续使用,支持链式编程
在Stream流中无法直接修改集合、数组中的数据
List<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));
long size = list.stream().filter(s -> s.length() == 3).count();
System.out.println(size);
list.stream().filter(s -> s.startsWith("张")).limit(2).forEach(System.out::println);
list.stream().filter(s -> s.startsWith("张")).skip(2).forEach(System.out::println);
list.stream().map(s -> "大学的:" + s).forEach(a -> System.out.println(a));
list.stream().map(s -> new Student(s)).forEach(s -> System.out.println(s));
Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));
Stream<String> s2 = Stream.of("java1", "java2");
Stream<String> s3 = Stream.concat(s1 , s2);
s3.distinct().forEach(s -> System.out.println(s));
list.stream().max((e1, e2) -> Double.compare(e1.getWeight(), e2.getWeight())).map(e -> new TopWeightApple(e.getName(), e.getWeight()));
list.stream().sorted((e1, e2) -> Double.compare(e1.getWeight(), e2.getWeight())).skip(1).limit(one.size() - 2).forEach(System.out::println);
2.3 Stream流常用终结方法
名称 | 说明 |
---|
void forEach(Consumer action) | 对此流的每个元素执行遍历操作 |
long count() | 返回此流中的元素数 |
- 注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream流了
3 Stream流收集
- 收集Stream流的含义:就是把Stream流操作后的结果数据转回到集合或者数组中去
- Stream流:方便操作集合/数组的手段
- 集合/数组:才是开发中的目的
名称 | 说明 |
---|
R collect(Collector collector) | 开始收集Stream流,指定收集器 |
具体收集方式 | 说明 |
---|
public static Collector toList() | 把元素收集到List集合中 |
public static Collector toSet() | 把元素收集到Set集合中 |
public static Collector toMap(Function keyMapper , Function valueMapper) | 把元素收集到Map集合中 |
Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));
List<String> zhangList = s1.collect(Collectors.toList());
Set<String> zhangSet = s2.collect(Collectors.toSet());
List<String> list1 = s1.toList();