Stream
Stream流是 JDK1.8新特性,对集合的元素进行过滤,筛选等一些操作
对list集合中的元素进行两次过滤只需要元素以张开头的并且长度为2最后遍历集合
list.stream()
.filter(name->name.startsWith("张"))
.filter(name -> name.length()==2)
.forEach(name -> System.out.println(name));
stream流的获取方式
根据Collection获取流(所有collection集合都可以通过stream默认方法获取流)
List<String> list1 = new ArrayList<>();
Stream<String> stream = list1.stream();
stream接口的静态方法of可以获取数组对应的流(of方法的参数为可变参数)
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4);
stream流的常用方法
1.延迟方法:返回值类型依然是strean接口自身类型的方法,因此支持链式调用
- filter()方法,该方法接收一个Predicate函数接口,因此可以使用lamdba表达式或方法引用
Stream filter(Predicate<? super T> predicate);
//先用stream接口的of方法获取流
Stream<String> stringStream = Stream.of("sada", "shjd", "adad", "lkda");
//过滤掉不是s开头的字符串
stringStream.filter(s -> s.startsWith("s"))
.forEach(System.out::println);
- map()方法,如果需要将流中的元素映射到另一个流中,可以使用map方法,该方法接收一个Function函数接口,因此可以使用lamdba表达式或方法引用
Stream map(Function<? super T, ? extends R> mapper);
//先用stream接口的of方法获取流
Stream<String> stringStream = Stream.of("1111", "2222", "3333", "4444");
//再调用stream接口的map方法
Stream<Integer> integerStream1 = stringStream.map(Integer::parseInt);
- limit()方法,可以对流进行截取,只要前n个,该方法接收一个long类型的值
Stream limit(long maxSize);
//先用stream接口的of方法获取流
Stream<String> stringStream1 = Stream.of("1111", "2222", "3333", "4444");
//再调用stream接口的limit方法
Stream<String> limit = stringStream1.limit(2);
- skip()方法,可以跳过前n个元素,如果流的当前长度大于n,则跳过前n个,反之会得到一个长度为0的空流,该方法接收一个long类型的值
Stream skip(long n);
//先用stream接口的of方法获取流
Stream<String> stringStream2 = Stream.of("1111", "2222", "3333", "4444");
//再调用stream接口的skip方法
stringStream2.skip(2)
.forEach(System.out::println);
- concat()静态方法,可以将两个流合并成一个流,该方法接收两个stream流
public static Stream concat(Stream<? extends T> a, Stream<? extends T> b)
//先用stream接口的of方法获取流
Stream<String> stringStream3 = Stream.of("1111", "2222", "3333", "4444");
//再用stream接口的of方法获取流
Stream<String> stringStream4 = Stream.of("1111", "2222", "3333", "4444");
//再调用stream接口的concat静态方法
Stream.concat(stringStream4,stringStream3)
.forEach(System.out::println);
2.终结方法:返回值类型不是Stream接口自身类型的方法,因此不支持链式调用
- forEach()方法,该方法接收一个Consumer函数接口,因此可用lambda表达式或方法引用
void forEach(Consumer<? super T> action);
//先用stream接口的of方法获取流
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4);
//再调用stream接口的forEach方法进行遍历输出
integerStream.forEach(System.out::println);
- count()方法,获取流中元素个数,该方法返回一个long值
long count();
//先用stream接口的of方法获取流
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4);
//再调用stream接口的count方法
long count = integerStream .count();
stream流的特点
Stream流属于管道流,所以只能使用一次,当一个stream流调用完一个方法时就关闭了,数据会到下一个流身上。