转换流操作:例如filter和map方法,将一个Stream转换成另一个Stream,返回值都是Stream。
终结流操作:例如count和collect方法,将一个Stream汇总为我们需要的结果,返回值都不是Stream。
无状态:即此方法的执行无需依赖前面方法执行的结果集。
有状态:即此方法的执行需要依赖前面方法执行的结果集。
ListInteger list = List.of(1, 2, 3); ListInteger filterList = new ArrayList();
for (Integer i : list) { if (i 2) { filterList.add(i); } }
System.out.println(filterList);
ListInteger list = List.of(1, 2, 3); ListInteger filterList = new ArrayList();
for (Integer i : list) { if (i 2 i 10 (i % 2 == 0)) { filterList.add(i); } }
System.out.println(filterList);
ListInteger list = List.of(1, 2, 3).stream() .filter(i - i 2) .filter(i - i
10) .filter(i - i % 2 == 0) .collect(toList());
ListInteger list = List.of(1, 2, 3).stream() .filter(i - i 2) .filter(i - i
10) .filter(i - i % 2 == 0) .collect(toList());
由于每次Stream操作都会生成一个新的Stream,所以Stream是不可变的,就像String。
在Stream中只保存原集合的引用,所以在进行一些会修改元素的操作时,是通过原元素生成一份新的新元素,所以Stream 的任何操作都不会影响到原对象。
List.of(1, 2, 3).stream() .filter(i - i 2) .peek(System.out::println);
List.of(1, 2, 3).stream() .filter(i - i 2) .peek(System.out::println)
.count();
使用Steam接口创建
通过集合类库创建
public static Stream of(T… values) { return Arrays.stream(values); }
StreamInteger integerStream = Stream.of(1, 2, 3); StreamDouble doubleStream =
Stream.of(1.1d, 2.2d, 3.3d); StreamString stringStream = Stream.of("1",
"2", "3");
StreamInteger integerStream = Stream.of(1, 2, 3);
StreamObject empty = Stream.empty();
public static Stream generate(Supplier? extends T s) {
Objects.requireNonNull(s); return StreamSupport.stream( new
StreamSpliterators.InfiniteSupplyingSpliterator.OfRef(Long.MAX_VALUE, s),
false); }
StreamString generate = Stream.generate(() - "Supplier"); StreamInteger
generateInteger = Stream.generate(() -
StreamInteger integerStreamList = List.of(1, 2, 3).stream(); StreamString
stringStreamList = List.of("1", "2", "3").stream();
StreamInteger listStream = List.of(1, 2, 3).stream(); StreamInteger setStream
= Set.of(1, 2, 3).stream();
default Stream stream() { return StreamSupport.stream(spliterator(), false); }
StreamInteger integerParallelStream = Stream.of(1, 2, 3).parallel();
StreamString stringParallelStream = Stream.of("1", "2", "3").parallel();
StreamInteger integerParallelStreamList = List.of(1, 2, 3).parallelStream();
StreamString stringParallelStreamList = List.of("1", "2",
"3").parallelStream();
default Stream stream() { return StreamSupport.stream(spliterator(), false); }
default Stream parallelStream() { return StreamSupport.stream(spliterator(),
true); }
Stream.of(1, 2, 3).parallel().sequential();
StreamInteger concat = Stream .concat(Stream.of(1, 2, 3), Stream.of(4, 5, 6));
StreamInteger integerStream = Stream.of(1, 2, 3); StreamString stringStream =
Stream.of("1", "2", "3"); Stream? extends Serializable stream =
Stream.concat(integerStream, stringStream);
map()方法:此方法的参数是一个Function对象,它可以使你对集合中的元素做自定义操作,并保留操作后的元素。
filter()方法:此方法的参数是一个Predicate对象,Predicate的执行结果是一个Boolean类型,所以此方法只保留返回值为true的元素,正如其名我们可以使用此方法做一些筛选操作。
flatMap()方法:此方法和map()方法一样参数是一个Function对象,但是此Function的返回值要求是一个Stream,该方法可以将多个Stream中的元素聚合在一起进行返回。
StreamInteger integerStreamList = List.of(1, 2, 3).stream(); StreamInteger
mapStream = integerStreamList.map(i - i * 10);
StreamInteger integerStreamList = List.of(1, 2, 3).stream(); StreamInteger
filterStream = integerStreamList.filter(i - i
ListOrder orders = List.of(new Order(), new Order()); StreamItem itemStream =
orders.stream() .flatMap(order - order.getItemList().stream());
Stream peek(Consumer? super T action);
StreamInteger peekStream = integerStreamList.peek(i - System.out.println(i));
List.of(1, 2, 3).stream() .map(i - i * 10) .peek(System.out::println)
.count();
mapToInt
mapToLong
mapToDouble
flatMapToInt
flatMapToLong
flatMapToDouble
mapToInt返回值为IntStream
mapToLong返回值为LongStream
mapToDouble返回值为DoubleStream
flatMapToInt返回值为IntStream
flatMapToLong返回值为LongStream
flatMapToDouble返回值为DoubleStream
IntStream:对应基础数据类型中的int、short、char、boolean
LongStream:对应基础数据类型中的long
DoubleStream:对应基础数据类型中的double和float
ListInteger list = List.of(1, 2, 3).stream() .map(i - i * 10) .filter(i - i
10) .filter(i - i % 2 == 0) .collect(toList());
不可变:不影响原集合,每次调用都返回一个新的Stream。
延迟执行:在遇到终结操作之前,Stream不会执行。
同时,本文在写作过程中也参考了以下书籍:
写给大忙人看的Java SE 8
Java 8 函数式编程
Java 8 实战
这三本书都非常好,第一本是Java核心技术的作者写的,如果你想全面的了解JDK8的升级可以看这本。
第二本可以说是一个小册子,只有一百多页很短,主要讲了一些函数式的思想。
如果你只能看一本,那么我这里推荐第三本,豆瓣评分高达9.2,内容和质量都当属上乘。