主题:流的操作
一、建立:
- 数组创建:
//由数组生成流
String[] array=new String[]{"a","b","c"};
Stream<String> stream1=Arrays.stream(array);
- Collection创建
//由集合生成的流
Collection<String> collection=new ArrayList<>();
Stream<String> stream2=collection.stream();
- 函数创建
//由函数生成的无限流
Stream<Double> stream3=Stream.iterate(Double.valueOf(10),m->Math.random()*m);
Stream<Double> stream4= Stream.generate(()->Math.random());
- 文件创建:
//由文件生成流
try(Stream<String> stream5=Files.lines(Paths.get("abc.txt"), Charset.defaultCharset())){
stream5.forEach(s-> System.out.println(s));
}catch (IOException e){ }
二、 筛选:
- 原型:中间操作
Stream<T> filter(Predicate<? super T> predicate);
- demo:
Arrays.asList(3,9,1,8)
.stream()
.filter(i->i>5);
三、 切片:
- 原型:中间操作
Stream<T> skip(long n);
Stream<T> limit(long maxSize);
- demo:
Arrays.asList(3,9,1,8)
.stream()
.skip(1)
.limit(2);
四、映射:
* 普通映射
- 原型:
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
- demo:
Arrays.asList(3,9,1,8)
.stream()
.map(i->"string:"+i);
* 扁平化映射:
- 原型:中间操作
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
说明:它的操作分为两个步骤
- 第一步将流中每个元素转化成为stream(不可以转变成为“原始值Stream”)
- 第二步:将上步得到的若干个Stream合并成为一个Stream
- demo: 把若干个字符串遍历出来
- 一次性转化方案
Arrays.asList("abc","bcd")
.stream()
.flatMap(s->Arrays.stream(s.split("")))
.forEach(s-> System.out.println(s));
- 两步转化方案
Arrays.asList("abc","bcd")
.stream()
.map(s->s.split(""))
.flatMap(ary->Arrays.stream(ary))
.forEach(s-> System.out.println(s));
五、查找、匹配、统计、遍历
- 原型:终端操作
Optional<T> findFirst();
Optional<T> findAny();
boolean noneMatch(Predicate<? super T> predicate);
boolean allMatch(Predicate<? super T> predicate);
boolean anyMatch(Predicate<? super T> predicate);
long count();
void forEach(Consumer<? super T> action);
void forEachOrdered(Consumer<? super T> action);
六、reduce操作:
- 原型:终端操作
T reduce(T identity, BinaryOperator<T> accumulator);
Optional<T> reduce(BinaryOperator<T> accumulator);
<U> U reduce(U identity,
BiFunction<U, ? super T, U> accumulator,
BinaryOperator<U> combiner);
- demo:
//求和
int m=Arrays.asList(4,1,3,9,8)
.stream()
.reduce(0,(prev,current)->prev+current);
//考虑到stream为空的情况
int m1=Arrays.asList(4,1,3,9,8)
.stream()
.reduce((prev,current)->prev+current)
.get();
//类型转换操作后的求和
Integer m2=Arrays.asList("4","1","7","9","8")
.stream()
.reduce(Integer.valueOf(0),(prev,current)->prev+Integer.valueOf(current),(a,b)->0);
七、排序
- 原型:
Stream<T> sorted();
Stream<T> sorted(Comparator<? super T> comparator);
- demo:
略...