//把集合转换为Stream流
List<String> list1 = new ArrayList<>();
Stream<String> stream1 = list1.stream();
Set<String> set = new HashSet<>();
Stream<String> stream2 = set.stream();
//把Map集合转换为Stream流
Map<String,String> map = new HashMap<>();
Set<String> keySet = map.keySet();
Stream<String> stream3 = keySet.stream();
Collection<String> values = map.values();
Stream<String> stream4 = values.stream();
//把数组转换为Stream流
Stream<Integer> stream5 = Stream.of(1, 2, 3, 4, 5);
//可变参数先传递给数组
Integer[] arr = {1,2,3,4,5};
Stream<Integer> stream6 = Stream.of(arr);
●延迟方法:返回值类型仍然是Stream接口自身类型的方法,因此支持链式调用。(除了终结方法外,其余方 法均为延迟方法。)
●终结方法:返回值类型不再是Stream接口自身类型的方法,因此不再支持类似StringBuilder那样的链式调用。终结方法包括count和forEach方法…。
Stream流中的常用方法_ forEach
void forEach(Consumer<? super T> action);
该方法接收一个Consumer接口函数,会将每一个流元素交给该函数进行处理。 Consumer接口是一个消费型的函数式接口,可以传递L
ambda表达式,消费数据 简单记: forEach方法,用来遍历流中的数据
是一个终结方法,遍历之后就不能继续调用Stream流中的其他方法
Stream流中的常用方法_ filter
用于对Stream流中的数据进行过滤 Stream filter(Predicate<? super T> predicate);
filter方法的参数Predicate是一个函数式接口,所以可以传递Lambda表达式,对数据进行过滤
Predicate中的抽象方法:boolean test(T t);
注意:
Stream流属于管道流,只能被消费(使用)一次 第一个Stream流调用完毕方法,数据就会流转到下一个Stream上
而这时第一个Stream流已经使用完毕, 就会关闭了 所以第一个Stream流就不能再调用方法了
IllegalStateException: stream has already been operated upon or closed
如果需要将流中的元素映射到另一个流中,可以使用map方法.
<R.>Stream <R.> map(Function<? super T,? extends R> mapper); 该接口需要一个Function函数式接口参数,可以将当前流中的类型数据转换为另一种R类型的流。 Function中的抽象方法: R apply(T t);
Stream流中的常用方法_ count
用于统计Stream流中元素的个数 Long count(); count方法是一个终结方法,返回值是一个long类型的整数
所以不能再继续调用Stream流中的其他方法了
Stream流中的常用方法_ limit
:用于截取流中的元素 limit方法可以对流进行截取,只取用前n个。方法签名: Stream <.T> limit(long maxSize); 参数是一个long型,如果集合当前长度大于参数则进行截取;否则不进行操作
limit方法是一个延迟方法,只是对流中的元素进行截取返回的是一个新的流, 所以可以继续调用Stream流中的其他方法
Stream流中的常用方法skip
: 用于跳过元素 如果希望跳过前几个元素,可以使用skip方法获取一-个截取之后的新流: . Stream<.T> skip(long
n); 如果流的当前长度大于n,则跳过前n个;否则将会得到- -个长度为0的空流。
Stream流中的常用方法_ concat
用于把流组合到一起 如果有两个流,希望合并成为一个流,那么可以使用Stream接口的静态方法concat static <T.>
Stream<T.> concat(Stream<? extends T> a, Stream<? extends T> b)